<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 12, 2016, at 1:24 PM, Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com" class="">gribozavr@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 12, 2016 at 9:44 AM, Michael Ilseman via swift-dev<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:swift-dev@swift.org" target="_blank" class="">swift-dev@swift.org</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><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;" class=""><div class="">Hello, I'm interested in enabling finer-grained control over warning/error</div><div class="">reporting ala Clang. I've started to put in some infrastructure to</div><div class="">DiagnosticEngine, and now I'm at the point of determining categorization.&nbsp;</div><div class=""><br class=""></div><div class="">I'd like some input (and maybe even some bikeshedding!) on the community's</div><div class="">thoughts and preferences here. Here's my take on the issue:</div><div class=""><br class=""></div><div class="">When it comes to defining the categorization, I can see a few approaches:&nbsp;</div><div class=""><ol class=""><li class="">&nbsp;Categorize based on broad language-feature/compiler-area. E.g. "Availability" or “CommandLineArguments”</li><li class="">&nbsp;Categorize based on the kind of warning. E.g. "Deprecated" or &nbsp;“Uninitialized"</li><li class="">&nbsp;Categorize based on severity or specificity of warnings. E.g. "Pedantic" or "UnusedValue" or "NullDereference"</li></ol></div><div class=""><br class=""></div><div class="">And, of course, I think that preference should be given to how people would</div><div class="">actively like to use the categories to control warnings. For example, there's</div><div class="">a handful of warnings that makes less sense in a REPL or rapid experimentation</div><div class="">environment, such as variable_never_mutated.</div></div></blockquote><div class=""><br class=""></div><div class="">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 class=""><br class=""></div></div></div></div></div></blockquote><div><br class=""></div><div>That makes sense.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><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;" class=""><div class="">Here's a straw-man proposal of some categorization. Of course, one developer's</div><div class="">annoying pedantic warning is another's life-saving code-smell detector. I am not</div><div class="">personally tied to these categorizations at all, I'm just interested in there</div><div class="">being something simple and basic. Below is a list of every warning in Swift with</div><div class="">an attempt to put it under a category.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Deprecated:</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>var_not_allowed_in_pattern</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"Use of '%select{var|let}0' binding here is deprecated and will be "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"removed in a future version of Swift"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>deprecated_c_style_for_stmt</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"C-style for statement is deprecated and will be removed in a future "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"version of Swift"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>deprecated_convention_attribute</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"'@%0' attribute is deprecated; '@convention(%1)' should be used "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"instead"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>availability_deprecated</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{| %select{on|in}3 %2%select{| %4}3}1"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>availability_deprecated_msg</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{| %select{on|in}3 %2%select{| %4}3}1: %5"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>availability_deprecated_rename</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{| %select{on|in}3 %2%select{| %4}3}1: renamed to '%5'"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>parameter_curry_syntax_removed</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"curried function declaration syntax will be removed in a future "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"version of Swift; use a single parameter list"</div></div></blockquote><div class=""><br class=""></div><div class="">I think there should be separate categories for deprecated language features and deprecated APIs.</div></div></div></div></div></blockquote><div><br class=""></div><div>It might also make sense for there to be a DeprecatedTooling or some such for deprecated command line flags, etc. Here’s it broken down some more:</div><div><br class=""></div><div>DeprecatedLanguage:</div><div><div class="">&nbsp; &nbsp; var_not_allowed_in_pattern</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "Use of '%select{var|let}0' binding here is deprecated and will be "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "removed in a future version of Swift"</div><div class="">&nbsp; &nbsp; deprecated_c_style_for_stmt</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "C-style for statement is deprecated and will be removed in a future "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "version of Swift"</div><div class="">&nbsp; &nbsp; deprecated_convention_attribute</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'@%0' attribute is deprecated; '@convention(%1)' should be used "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; “instead"</div><div class=""><div class="">&nbsp; &nbsp; parameter_curry_syntax_removed</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "curried function declaration syntax will be removed in a future "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "version of Swift; use a single parameter list"</div></div><div class=""><br class=""></div><div class="">DeprecatedAPI:</div><div class=""><div class="">&nbsp; &nbsp; availability_deprecated</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{| %select{on|in}3 %2%select{| %4}3}1"</div><div class="">&nbsp; &nbsp; availability_deprecated_msg</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{| %select{on|in}3 %2%select{| %4}3}1: %5"</div><div class="">&nbsp; &nbsp; availability_deprecated_rename</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%0 %select{is|%select{is|was}3}1 deprecated"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{| %select{on|in}3 %2%select{| %4}3}1: renamed to '%5'"</div></div></div><div><br class=""></div><div>DeprecatedTooling:</div><div>&nbsp; TBD</div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class="">&nbsp;</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;" class=""><div class="">Unsupported:</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>warning_parallel_execution_not_supported</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"parallel execution not supported; falling back to serial execution"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>unsupported_synthesize_init_variadic</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"synthesizing a variadic inherited initializer for subclass %0 is "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"unsupported"</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Stylistic/Pedantic/Cleanliness:</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>pbd_never_used_stmtcond</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"value %0 was defined but never used; consider replacing "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"with boolean test"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>pbd_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"initialization of %select{variable|immutable value}1 %0 was never used"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"; consider replacing with assignment to '_' or removing it"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>capture_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"capture %0 was never used",</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>variable_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{variable|immutable value}1 %0 was never used; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"consider replacing with '_' or removing it"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>variable_never_mutated</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{variable|parameter}1 %0 was never mutated; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"consider changing to 'let' constant"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>variable_never_read</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{variable|parameter}1 %0 was written to, but never read"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>expression_unused_result</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"result of call to %0 is unused"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>expression_unused_init_result</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"result of initializer is unused", ())</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>expression_unused_result_message</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"result of call to %0 is unused: %1"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>expression_unused_result_nonmutating</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"result of call to non-mutating function %0 is unused; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"use %1 to mutate in-place"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>expression_unused_optional_try</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"result of 'try?' is unused"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>non_trailing_closure_before_default_args</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"closure parameter prior to parameters with default arguments will "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"not be treated as a trailing closure"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>parameter_extraneous_double_up</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"extraneous duplicate parameter name; %0 already has an argument "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"label"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>parameter_extraneous_empty_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"extraneous '_' in parameter: %0 has no keyword argument name"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>escaped_parameter_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"keyword '%0' does not need to be escaped in argument list"</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">CodeSmell/StrongStylisticHints:</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>guard_always_succeeds</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"'guard' condition is always true, body is unreachable"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>warn_unqualified_access</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"use of %0 treated as a reference to %1 in %2 %3"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>var_pattern_didnt_bind_variables</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"'%0' pattern has no effect; sub-pattern didn't bind any variables"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>type_inferred_to_undesirable_type</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"%select{variable|constant}2 %0 inferred to have type %1, "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"which may be unexpected"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>no_throw_in_try</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"no calls to throwing functions occur within 'try' expression"</div><div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>no_throw_in_do_with_catch</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>"'catch' block is unreachable because no errors are thrown in 'do' block"</div></div></blockquote><div class=""><br class=""></div><div class="">It seems like some of these can be too pedantic in cross-platform code bases because of #if's that are not analyzable and might need more granular suppression mechanisms. &nbsp; For example:</div><div class=""><br class=""></div><div class=""><div class="">func foo() throws {}</div><div class="">func bar() {}</div><div class=""><br class=""></div><div class="">func baz() {</div><div class="">&nbsp; do {</div><div class="">#if os(OSX)</div><div class="">&nbsp; &nbsp; try foo()</div><div class="">#else</div><div class="">&nbsp; &nbsp; bar()</div><div class="">#endif</div><div class="">&nbsp; &nbsp; // common code.</div><div class="">&nbsp; } catch { // on non-OS X,&nbsp;warning: 'catch' block is unreachable because no errors are thrown in 'do' block</div><div class="">&nbsp; &nbsp; // ...</div><div class="">&nbsp; }</div><div class="">}</div></div><div class=""><br class=""></div><div class="">I definitely remember we had some similar issues in the standard library or tests, but don't remember the specifics.</div><div class=""><br class=""></div></div></div></div></div></blockquote><div><br class=""></div><div>Ah, I didn’t think about that. I suppose classification is even more of a gray area than I thought. Do you think that certain ones are more likely than others to come up as a result of platform differences?</div><div><br class=""></div><div>no_throw_in_do_with_catch, no_throw_in_try seem like prime examples. How often is it that platform differences yield always-true conditions or unreachable code?</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class="">Dmitri</div></div><div class=""><br class=""></div>--<span class="Apple-converted-space">&nbsp;</span><br class=""><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 class="">(j){printf("%d\n",i);}}} /*Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com" target="_blank" class="">gribozavr@gmail.com</a>&gt;*/</div></div></div></div></blockquote></div><br class=""></body></html>