<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 12, 2016 at 9:44 AM, Michael Ilseman via swift-dev <span dir="ltr">&lt;<a href="mailto:swift-dev@swift.org" target="_blank">swift-dev@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Hello, I&#39;m interested in enabling finer-grained control over warning/error</div><div>reporting ala Clang. I&#39;ve started to put in some infrastructure to</div><div>DiagnosticEngine, and now I&#39;m at the point of determining categorization. </div><div><br></div><div>I&#39;d like some input (and maybe even some bikeshedding!) on the community&#39;s</div><div>thoughts and preferences here. Here&#39;s my take on the issue:</div><div><br></div><div>When it comes to defining the categorization, I can see a few approaches: </div><div><ol><li> Categorize based on broad language-feature/compiler-area. E.g. &quot;Availability&quot; or “CommandLineArguments”</li><li> Categorize based on the kind of warning. E.g. &quot;Deprecated&quot; or  “Uninitialized&quot;</li><li> Categorize based on severity or specificity of warnings. E.g. &quot;Pedantic&quot; or &quot;UnusedValue&quot; or &quot;NullDereference&quot;</li></ol></div><div><br></div><div>And, of course, I think that preference should be given to how people would</div><div>actively like to use the categories to control warnings. For example, there&#39;s</div><div>a handful of warnings that makes less sense in a REPL or rapid experimentation</div><div>environment, such as variable_never_mutated.</div></div></blockquote><div><br></div><div>Since we try to keep warnings on-by-default, the primary usecase will probably be disabling warnings that are somehow inappropriate for the project.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Here&#39;s a straw-man proposal of some categorization. Of course, one developer&#39;s</div><div>annoying pedantic warning is another&#39;s life-saving code-smell detector. I am not</div><div>personally tied to these categorizations at all, I&#39;m just interested in there</div><div>being something simple and basic. Below is a list of every warning in Swift with</div><div>an attempt to put it under a category.</div><div><br></div><div><br></div><div>Deprecated:</div><div>    var_not_allowed_in_pattern</div><div>        &quot;Use of &#39;%select{var|let}0&#39; binding here is deprecated and will be &quot;</div><div>        &quot;removed in a future version of Swift&quot;</div><div>    deprecated_c_style_for_stmt</div><div>        &quot;C-style for statement is deprecated and will be removed in a future &quot;</div><div>        &quot;version of Swift&quot;</div><div>    deprecated_convention_attribute</div><div>        &quot;&#39;@%0&#39; attribute is deprecated; &#39;@convention(%1)&#39; should be used &quot;</div><div>        &quot;instead&quot;</div><div>    availability_deprecated</div><div>        &quot;%0 %select{is|%select{is|was}3}1 deprecated&quot;</div><div>        &quot;%select{| %select{on|in}3 %2%select{| %4}3}1&quot;</div><div>    availability_deprecated_msg</div><div>        &quot;%0 %select{is|%select{is|was}3}1 deprecated&quot;</div><div>        &quot;%select{| %select{on|in}3 %2%select{| %4}3}1: %5&quot;</div><div>    availability_deprecated_rename</div><div>        &quot;%0 %select{is|%select{is|was}3}1 deprecated&quot;</div><div>        &quot;%select{| %select{on|in}3 %2%select{| %4}3}1: renamed to &#39;%5&#39;&quot;</div><div>    parameter_curry_syntax_removed</div><div>        &quot;curried function declaration syntax will be removed in a future &quot;</div><div>        &quot;version of Swift; use a single parameter list&quot;</div></div></blockquote><div><br></div><div>I think there should be separate categories for deprecated language features and deprecated APIs.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Unsupported:</div><div>    warning_parallel_execution_not_supported</div><div>        &quot;parallel execution not supported; falling back to serial execution&quot;</div><div>    unsupported_synthesize_init_variadic</div><div>        &quot;synthesizing a variadic inherited initializer for subclass %0 is &quot;</div><div>        &quot;unsupported&quot;</div><div><br></div><div><br></div><div>Stylistic/Pedantic/Cleanliness:</div><div>    pbd_never_used_stmtcond</div><div>        &quot;value %0 was defined but never used; consider replacing &quot;</div><div>        &quot;with boolean test&quot;</div><div>    pbd_never_used</div><div>        &quot;initialization of %select{variable|immutable value}1 %0 was never used&quot;</div><div>        &quot;; consider replacing with assignment to &#39;_&#39; or removing it&quot;</div><div>    capture_never_used</div><div>        &quot;capture %0 was never used&quot;,</div><div>    variable_never_used</div><div>        &quot;%select{variable|immutable value}1 %0 was never used; &quot;</div><div>        &quot;consider replacing with &#39;_&#39; or removing it&quot;</div><div>    variable_never_mutated</div><div>        &quot;%select{variable|parameter}1 %0 was never mutated; &quot;</div><div>        &quot;consider changing to &#39;let&#39; constant&quot;</div><div>    variable_never_read</div><div>        &quot;%select{variable|parameter}1 %0 was written to, but never read&quot;</div><div>    expression_unused_result</div><div>        &quot;result of call to %0 is unused&quot;</div><div>    expression_unused_init_result</div><div>        &quot;result of initializer is unused&quot;, ())</div><div>    expression_unused_result_message</div><div>        &quot;result of call to %0 is unused: %1&quot;</div><div>    expression_unused_result_nonmutating</div><div>        &quot;result of call to non-mutating function %0 is unused; &quot;</div><div>        &quot;use %1 to mutate in-place&quot;</div><div>    expression_unused_optional_try</div><div>        &quot;result of &#39;try?&#39; is unused&quot;</div><div>    non_trailing_closure_before_default_args</div><div>        &quot;closure parameter prior to parameters with default arguments will &quot;</div><div>        &quot;not be treated as a trailing closure&quot;</div><div>    parameter_extraneous_double_up</div><div>        &quot;extraneous duplicate parameter name; %0 already has an argument &quot;</div><div>        &quot;label&quot;</div><div>    parameter_extraneous_empty_name</div><div>        &quot;extraneous &#39;_&#39; in parameter: %0 has no keyword argument name&quot;</div><div>    escaped_parameter_name</div><div>        &quot;keyword &#39;%0&#39; does not need to be escaped in argument list&quot;</div><div><br></div><div><br></div><div>CodeSmell/StrongStylisticHints:</div><div>    guard_always_succeeds</div><div>        &quot;&#39;guard&#39; condition is always true, body is unreachable&quot;</div><div>    warn_unqualified_access</div><div>        &quot;use of %0 treated as a reference to %1 in %2 %3&quot;</div><div>    var_pattern_didnt_bind_variables</div><div>        &quot;&#39;%0&#39; pattern has no effect; sub-pattern didn&#39;t bind any variables&quot;</div><div>    type_inferred_to_undesirable_type</div><div>        &quot;%select{variable|constant}2 %0 inferred to have type %1, &quot;</div><div>        &quot;which may be unexpected&quot;</div><div>    no_throw_in_try</div><div>        &quot;no calls to throwing functions occur within &#39;try&#39; expression&quot;</div><div>    no_throw_in_do_with_catch</div><div>        &quot;&#39;catch&#39; block is unreachable because no errors are thrown in &#39;do&#39; block&quot;</div></div></blockquote><div><br></div><div>It seems like some of these can be too pedantic in cross-platform code bases because of #if&#39;s that are not analyzable and might need more granular suppression mechanisms.   For example:</div><div><br></div><div><div>func foo() throws {}</div><div>func bar() {}</div><div><br></div><div>func baz() {</div><div>  do {</div><div>#if os(OSX)</div><div>    try foo()</div><div>#else</div><div>    bar()</div><div>#endif</div><div>    // common code.</div><div>  } catch { // on non-OS X, warning: &#39;catch&#39; block is unreachable because no errors are thrown in &#39;do&#39; block</div><div>    // ...</div><div>  }</div><div>}</div></div><div><br></div><div>I definitely remember we had some similar issues in the standard library or tests, but don&#39;t remember the specifics.</div><div><br></div><div>Dmitri</div></div><div><br></div>-- <br><div class="gmail_signature">main(i,j){for(i=2;;i++){for(j=2;j&lt;i;j++){if(!(i%j)){j=0;break;}}if<br>(j){printf(&quot;%d\n&quot;,i);}}} /*Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>&gt;*/</div>
</div></div>