<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 13, 2016, at 10:20 AM, Kate Stone &lt;<a href="mailto:k8stone@apple.com" class="">k8stone@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Ideally I can see wanting to have multiple overlapping categorization schemes. &nbsp;It’s pretty much axiomatic than <i class="">any</i>&nbsp;classification strategy involves tradeoffs, so allowing more than one is the only approach that makes sense. &nbsp;I may well want to turn off all warnings introduced after Swift 2.2, or enable only warnings for which Fix-It improvements are provided, or any other orthogonal conceptual collection.<div class=""><br class=""></div><div class="">Not that every conceivable collection should be supported, but the general notion that there could be overlapping categories seems worth considering.<br class=""><div class=""><br class=""></div></div></div></div></blockquote><div><br class=""></div><div>I had considered a tag-based mechanism rather than strict categories, but it seems to complicate both the user story and compiler maintenance.&nbsp;</div><div><br class=""></div><div>With strict categories, the underlying mechanism for deciding how to present a warning can proceed as follows:</div><div><ol class="MailOutline"><li class="">Honor local state (e.g. no more diagnostics after fatal), else</li><li class="">Honor specific warning specification, else</li><li class="">Honor categorical specification (e.g. ignore all pedantic language warnings), else</li><li class="">Honor global specification (e.g. all warnings are errors), else</li><li class="">Go with the default, declared handing (i.e. warn!)</li></ol></div><div><br class=""></div><div>This is easy and intuitive to communicate to the user on how to control it. If they bothered to single out a single warning, they probably care that it gets honored even if they gave a contradictory handling to its category or all warnings in general. When you talk about over-lapping categories and/or tags, step #3 become a much more complicated story to expose to the user.&nbsp;</div><div><br class=""></div><div>When it comes to compiler maintenance, new warnings will need to undergo scrutiny not just about their overall category, but whether any existing tags apply to them (including tags relating to when it is introduced/modified). Given that we want to allow ourselves the ability to flexibly refine, redefine, or extend warnings, we may find ourselves in a less flexible position if we start to no longer adhere to every tag present. It seems like a recipe for over-engineering, at least at this stage in the project. The worse case is that the user has to specify at the individual level.&nbsp;</div><div><br class=""></div><div>I’m not opposed to this, but after talking it over a bit it seemed hard to envision the benefits making the complexity worth it. When I implement the categories, I will try to take this potential future direction into account, and not needlessly paint us into a corner. It is certainly an interesting direction to investigate further along.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div class=""><div class=""><div style="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; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="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; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="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; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="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; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="" style="font-family: LucidaGrande; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><font color="#424242" class="" style="font-family: 'Lucida Grande'; font-size: x-small;">Kate Stone</font><span class="" style="font-family: 'Lucida Grande'; font-size: x-small;">&nbsp;</span><font color="#009193" class="" style="font-family: 'Lucida Grande'; font-size: x-small;"><a href="mailto:k8stone@apple.com" class="">k8stone@apple.com</a></font></div><div class="" style="font-family: Times; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><font face="Lucida Grande" size="1" class=""><font color="#009193" class=""></font>&nbsp;Xcode&nbsp;<font color="#424242" class="">Low Level Tools</font></font></div></div></div></div></div></div>
</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 12, 2016, at 5:15 PM, Michael Ilseman via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">By keeping it in mind, do you mean to allow for more categories to be added in the future, or does this affect the fundamental design?</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 12, 2016, at 5:06 PM, Michael Gottesman &lt;<a href="mailto:mgottesman@apple.com" class="">mgottesman@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 12, 2016, at 9:44 AM, Michael Ilseman via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" 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="MailOutline"><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 class=""><br class=""></div><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; 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="">&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 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 class=""><br class=""></div><div class=""><br class=""></div><div class="">Unsupported:</div><div class="">&nbsp; &nbsp; warning_parallel_execution_not_supported</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "parallel execution not supported; falling back to serial execution"</div><div class="">&nbsp; &nbsp; unsupported_synthesize_init_variadic</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "synthesizing a variadic inherited initializer for subclass %0 is "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unsupported"</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Stylistic/Pedantic/Cleanliness:</div><div class="">&nbsp; &nbsp; pbd_never_used_stmtcond</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "value %0 was defined but never used; consider replacing "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "with boolean test"</div><div class="">&nbsp; &nbsp; pbd_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "initialization of %select{variable|immutable value}1 %0 was never used"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "; consider replacing with assignment to '_' or removing it"</div><div class="">&nbsp; &nbsp; capture_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "capture %0 was never used",</div><div class="">&nbsp; &nbsp; variable_never_used</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{variable|immutable value}1 %0 was never used; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "consider replacing with '_' or removing it"</div><div class="">&nbsp; &nbsp; variable_never_mutated</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{variable|parameter}1 %0 was never mutated; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "consider changing to 'let' constant"</div><div class="">&nbsp; &nbsp; variable_never_read</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{variable|parameter}1 %0 was written to, but never read"</div><div class="">&nbsp; &nbsp; expression_unused_result</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result of call to %0 is unused"</div><div class="">&nbsp; &nbsp; expression_unused_init_result</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result of initializer is unused", ())</div><div class="">&nbsp; &nbsp; expression_unused_result_message</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result of call to %0 is unused: %1"</div><div class="">&nbsp; &nbsp; expression_unused_result_nonmutating</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result of call to non-mutating function %0 is unused; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "use %1 to mutate in-place"</div><div class="">&nbsp; &nbsp; expression_unused_optional_try</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result of 'try?' is unused"</div><div class="">&nbsp; &nbsp; non_trailing_closure_before_default_args</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "closure parameter prior to parameters with default arguments will "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "not be treated as a trailing closure"</div><div class="">&nbsp; &nbsp; parameter_extraneous_double_up</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "extraneous duplicate parameter name; %0 already has an argument "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "label"</div><div class="">&nbsp; &nbsp; parameter_extraneous_empty_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "extraneous '_' in parameter: %0 has no keyword argument name"</div><div class="">&nbsp; &nbsp; escaped_parameter_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "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; guard_always_succeeds</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'guard' condition is always true, body is unreachable"</div><div class="">&nbsp; &nbsp; warn_unqualified_access</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "use of %0 treated as a reference to %1 in %2 %3"</div><div class="">&nbsp; &nbsp; var_pattern_didnt_bind_variables</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'%0' pattern has no effect; sub-pattern didn't bind any variables"</div><div class="">&nbsp; &nbsp; type_inferred_to_undesirable_type</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{variable|constant}2 %0 inferred to have type %1, "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "which may be unexpected"</div><div class="">&nbsp; &nbsp; no_throw_in_try</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "no calls to throwing functions occur within 'try' expression"</div><div class="">&nbsp; &nbsp; no_throw_in_do_with_catch</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'catch' block is unreachable because no errors are thrown in 'do' block"</div><div class="">&nbsp; &nbsp; required_initializer_override_keyword</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'override' is implied when overriding a required initializer"</div><div class="">&nbsp; &nbsp; if_always_true</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'if' condition is always true"</div><div class="">&nbsp; &nbsp; while_always_true</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'while' condition is always true"</div><div class="">&nbsp; &nbsp; warn_protocol_witness_optionality</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{type|result|parameter|parameters|"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "result and parameters}0 of %1 %select{has|has|has|have|have|}0"</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; " different optionality than expected by protocol %2"</div><div class="">&nbsp; &nbsp; optional_req_nonobjc_near_match</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "non-@objc %select{initializer %1|method %1|property %1|subscript}0 "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "cannot satisfy optional requirement of @objc protocol %2"</div><div class="">&nbsp; &nbsp; override_unnecessary_IUO</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "overriding %0 parameter of type %1 with implicitly unwrapped optional "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "type %2",</div><div class="">&nbsp; &nbsp; override_unnecessary_result_IUO</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "overriding %0 optional result type %1 with implicitly unwrapped "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "optional type %2",</div><div class="">&nbsp; &nbsp; inject_forced_downcast, sema_tce, none,</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "treating a forced downcast to %0 as optional will never produce 'nil'"</div><div class="">&nbsp; &nbsp; recursive_accessor_reference, tce_sema, none,</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "attempting to %select{access|modify}1 %0 within its own "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{getter|setter}1",</div><div class="">&nbsp; &nbsp; store_in_willset, tce_sema, none,</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "attempting to store to property %0 within its own willSet, which is "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "about to be overwritten by the new value",</div><div class="">&nbsp; &nbsp; isa_is_always_true</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "'%0' test is always true",</div><div class="">&nbsp; &nbsp; conditional_downcast_coercion</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "conditional cast from %0 to %1 always succeeds"</div><div class="">&nbsp; &nbsp; downcast_to_unrelated, sema_tcc, none,</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "cast from %0 to unrelated type %1 always fails"</div><div class="">&nbsp; &nbsp; forced_downcast_noop</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "forced cast of %0 to same type has no effect"</div><div class="">&nbsp; &nbsp; forced_downcast_coercion</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "forced cast from %0 to %1 always succeeds; did you mean to use 'as'?"</div><div class="">&nbsp; &nbsp; extraneous_default_args_in_call</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "call to %0 has extraneous arguments that could use defaults"</div><div class="">&nbsp; &nbsp; unreachable_code</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "will never be executed"</div><div class="">&nbsp; &nbsp; unreachable_code_after_stmt</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "code after '%select{return|break|continue|throw}0' will never "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "be executed"</div><div class="">&nbsp; &nbsp; unreachable_case</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{case|default}0 will never be executed"</div><div class="">&nbsp; &nbsp; switch_on_a_constant</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "switch condition evaluates to a constant"</div><div class="">&nbsp; &nbsp; integer_conversion_overflow_warn</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "integer overflows when converted from %0 to %1"</div><div class="">&nbsp; &nbsp; integer_literal_overflow_warn</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "integer literal overflows when stored into %0"</div><div class="">&nbsp; &nbsp; trailing_closure_excess_newlines</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "trailing closure is separated from call site by multiple newlines"</div><div class="">&nbsp; &nbsp; lex_nul_character, lexing, none</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "nul character embedded in middle of file"</div><div class="">&nbsp; &nbsp; unindented_code_after_return</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "expression following 'return' is treated as an argument of "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "the 'return'"</div><div class="">&nbsp; &nbsp; lex_editor_placeholder_in_playground</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "editor placeholder in source file"</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Attributes:</div><div class="">&nbsp; &nbsp; attr_availability_unknown_platform</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unknown platform '%0' for attribute '%1'"</div><div class="">&nbsp; &nbsp; attr_warn_unused_result_expected_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "expected parameter 'message' or 'mutable_variant'"</div><div class="">&nbsp; &nbsp; attr_warn_unused_result_duplicate_parameter</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "duplicate '%0' parameter; previous value will be ignored"</div><div class="">&nbsp; &nbsp; attr_warn_unused_result_unknown_parameter</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unknown parameter '%0' in 'warn_unused_result' attribute"</div><div class="">&nbsp; &nbsp; attr_migration_id_expected_name</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "expected parameter 'pattern'"</div><div class="">&nbsp; &nbsp; attr_migration_id_unknown_parameter</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unknown parameter '%0' in '_migration_id' attribute"</div><div class="">&nbsp; &nbsp; attr_migration_id_duplicate_parameter</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "duplicate '%0' parameter; previous value will be ignored"</div><div class="">&nbsp; &nbsp; invalid_swift_name_method</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "too %select{few|many}0 parameters in swift_name attribute (expected %1; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "got %2)"</div><div class=""><br class=""></div><div class="">Availability:</div><div class="">&nbsp; &nbsp; availability_query_useless_min_deployment</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unnecessary check for '%0'; minimum deployment target ensures guard "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "will always be true"</div><div class="">&nbsp; &nbsp; availability_query_useless_enclosing_scope</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unnecessary check for '%0'; enclosing scope ensures guard "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "will always be true"</div><div class=""><br class=""></div><div class="">And the below I'm either struggling to think about how to categorize them</div><div class="">(perhaps no category at first), or un-familiar with what they're targeting</div><div class="">&nbsp; &nbsp; warning_from_clang:</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%0"</div><div class="">&nbsp; &nbsp; could_not_rewrite_bridging_header, none, none,</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "failed to serialize bridging header; "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "target may not be debuggable outside of its original project"</div><div class="">&nbsp; &nbsp; omit_needless_words</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%0 could be named %1 [-Womit-needless-words]"</div><div class="">&nbsp; &nbsp; unused_compiler_version_component</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "the second version component is not used for comparison"</div><div class="">&nbsp; &nbsp; unknown_build_config</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unknown %0 for build configuration '%1'"</div><div class="">&nbsp; &nbsp; sema_import_current_module</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "this file is part of module %0; ignoring import"</div><div class="">&nbsp; &nbsp; sema_import_current_module_with_file</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "file '%0' is part of module %1; ignoring import"</div><div class="">&nbsp; &nbsp; access_control_member_more</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "declaring %select{PRIVATE|an internal|a public}0 %1 for "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{a private|an internal|PUBLIC}2 %3"</div><div class="">&nbsp; &nbsp; access_control_ext_member_more</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "declaring %select{PRIVATE|an internal|a public}0 %1 in "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "%select{a private|an internal|PUBLIC}2 extension"</div><div class="">&nbsp; &nbsp; emit_reference_dependencies_without_primary_file</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "ignoring -emit-reference-dependencies (requires -primary-file)"</div><div class="">&nbsp; &nbsp; warning_no_such_sdk</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "no such SDK: '%0'"</div><div class="">&nbsp; &nbsp; warn_cannot_stat_input</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unable to determine when '%0' was last modified: %1"</div><div class="">&nbsp; &nbsp; warning_unnecessary_repl_mode</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "unnecessary option '%0'; this is the default for '%1' "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "with no input files"</div><div class="">&nbsp; &nbsp; incremental_requires_output_file_map</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "ignoring -incremental (currently requires an output file map)"</div><div class="">&nbsp; &nbsp; incremental_requires_build_record_entry</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "ignoring -incremental; output file map has no master dependencies "</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; "entry (\"%0\" under \"\")"</div><div class=""><br class=""></div><div class="">I haven’t gotten to how to expose this to the user, and I’ll defer to the community for suggestions in that area.&nbsp;</div></div></div></blockquote><div class=""><br class=""></div><div class="">Just an FYI: We have also talked about performance related warnings at the SIL level (that could potentially be a hard error). We do not have any such thing implemented right now, but keep it in mind.</div><div class=""><br class=""></div><div class="">Michael</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=BsPB5S3Z2usbY-2FzcCsd-2F2r4MihYe9FiKHjzH65yItK7f7rXGpeZLn4ggwakthCXY9jsMkjxaXetlQ-2FOVh-2F08q-2BxdgGtb92cF3LNKcrHq-2FN23sEp-2FRIQ98FAkE-2F3zD1pdwTLo4axVn0cZxg5KYfR1MWT4JdAJeTIpbt2l2-2FxKwM09YhAtSlyRwUMjSFbdvt2zHixij-2FoJri6oECE0G97xSQMAAAQgdA7mG7l3w9Ez7Z0-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;" class="">
</div>
_______________________________________________<br class="">swift-dev mailing list<br class=""><a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-dev" class="">https://lists.swift.org/mailman/listinfo/swift-dev</a><br class=""></div></blockquote></div><br class=""></div></div></blockquote></div><br class="">
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=9Y0WV-2FgqTGrqbN7qMHvjRxXmfmwtkNQjc5HmD-2BCpqdeqIP81VNViWbniWKWmqLYuJXGqZp7P0onw3w-2BySzRbylrgH3y0liO6CEysiJp0zgy6kM5eLDI5qppbgG8GRNIqCeu-2FfuHazJSNTWzwVrQJ23jpEbDnsjYrpE9OhjDaAmYlfpdSVTMbJkd-2BMlPbKE6DPbr4MccjsPXevjyXM3MCkYA56sRq9yVwjeH5mGqG4po-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;" class="">
</div>
_______________________________________________<br class="">swift-dev mailing list<br class=""><a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-dev" class="">https://lists.swift.org/mailman/listinfo/swift-dev</a><br class=""></div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></body></html>