r262881 - P0188R1: add support for standard [[fallthrough]] attribute. This is almost
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 10 11:28:04 PST 2016
On Thu, Mar 10, 2016 at 10:47 AM, Nico Weber <thakis at chromium.org> wrote:
> On Wed, Mar 9, 2016 at 6:44 PM, Nico Weber <thakis at chromium.org> wrote:
>>
>> On Tue, Mar 8, 2016 at 12:18 PM, Nico Weber <thakis at chromium.org> wrote:
>>>
>>> On Tue, Mar 8, 2016 at 2:10 PM, Richard Smith <richard at metafoo.co.uk>
>>> wrote:
>>>>
>>>> On Tue, Mar 8, 2016 at 11:04 AM, Nico Weber <thakis at chromium.org> wrote:
>>>> > On Tue, Mar 8, 2016 at 1:49 PM, Richard Smith <richard at metafoo.co.uk>
>>>> > wrote:
>>>> >>
>>>> >> On Tue, Mar 8, 2016 at 9:05 AM, Nico Weber <thakis at chromium.org>
>>>> >> wrote:
>>>> >> > This causes clang to warn on
>>>> >> >
>>>> >> > default: assert (false); HB_FALLTHROUGH;
>>>> >>
>>>> >> What follows this? (A case label?) What warning is being produced?
>>>> >
>>>> >
>>>> > A case label. Full snippet:
>>>> >
>>>> > https://code.google.com/p/chromium/codesearch#chromium/src/third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc&l=142
>>>> >
>>>> > Full warning (from
>>>> >
>>>> > https://build.chromium.org/p/chromium.fyi/builders/ClangToTMac%20%28dbg%29/builds/4497/steps/compile/logs/stdio):
>>>> >
>>>> > ../../third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc:142:30:
>>>> > error:
>>>> > fallthrough annotation in unreachable code
>>>> > [-Werror,-Wimplicit-fallthrough]
>>>> > default: assert (false); HB_FALLTHROUGH;
>>>> > ^
>>>> > ../../third_party/harfbuzz-ng/src/hb-private.hh:140:26: note: expanded
>>>> > from
>>>> > macro 'HB_FALLTHROUGH'
>>>> > # define HB_FALLTHROUGH [[clang::fallthrough]]
>>>> >
>>>> > As far as I know, we don't opt in to -Wimplicit-fallthrough (and I
>>>> > don't see
>>>> > a flag on the commandline of the failing compile; also available at
>>>> > the
>>>> > above link.)
>>>>
>>>> OK, I see what's going wrong. Half of -Wimplicit-fallthrough is off by
>>>> default, half of it is on by default. We used to do the CFG-based
>>>> analysis only if the warning was enabled (because otherwise it would
>>>> never produce any messages), and this change makes us also do the
>>>> analysis when the warning is disabled but there are [[fallthrough]];
>>>> statements in the function (it promotes the "misplaced
>>>> [[fallthrough]];" diagnostic from warning to error, so we need the
>>>> analysis if the attribute is present). This change should have had no
>>>> impact on -Wimplicit-fallthrough (either the warning was disabled so
>>>> no diagnostics are produced before and after, or the warning was
>>>> enabled so the same diagnostics are produced before and after), but
>>>> apparently when we ask "is this warning enabled?" and the warning
>>>> group contains multiple diagnostics, we don't check them all...
>>>>
>>>> There's an easy fix for clang: warn_fallthrough_attr_unreachable
>>>> should be marked DefaultIgnore.
>>>
>>>
>>> Sounds good. Are you doing that? Want me to do that?
>>
>>
>> ^ ping
>
>
> I gave this a shot in r263138.
Thanks, sorry for the delay. I added a test for your fix in r263155.
>>
>>
>>>
>>>
>>>>
>>>> (Though that chromium code would still
>>>> produce diagnostics -- with or without this change -- if you build
>>>> with -Wimplicit-fallthrough and -DNDEBUG, so maybe you do need a
>>>> different macro for that case regardless.)
>>>>
>>>> >> > The fallthrough needs to be there for release builds, but now it
>>>> >> > must
>>>> >> > not be
>>>> >> > there for debug builds. I suppose this means projects now need an
>>>> >> > UNREACHED_CASE macro that expands to assert(false) in debug and to
>>>> >> > fallthrough in release (with clang; and to something else with
>>>> >> > other
>>>> >> > compilers)?
>>>> >> >
>>>> >> > On Mon, Mar 7, 2016 at 7:32 PM, Richard Smith via cfe-commits
>>>> >> > <cfe-commits at lists.llvm.org> wrote:
>>>> >> >>
>>>> >> >> Author: rsmith
>>>> >> >> Date: Mon Mar 7 18:32:55 2016
>>>> >> >> New Revision: 262881
>>>> >> >>
>>>> >> >> URL: http://llvm.org/viewvc/llvm-project?rev=262881&view=rev
>>>> >> >> Log:
>>>> >> >> P0188R1: add support for standard [[fallthrough]] attribute. This
>>>> >> >> is
>>>> >> >> almost
>>>> >> >> exactly the same as clang's existing [[clang::fallthrough]]
>>>> >> >> attribute,
>>>> >> >> which
>>>> >> >> has been updated to have the same semantics. The one significant
>>>> >> >> difference
>>>> >> >> is that [[fallthrough]] is ill-formed if it's not used immediately
>>>> >> >> before
>>>> >> >> a
>>>> >> >> switch label (even when -Wimplicit-fallthrough is disabled). To
>>>> >> >> support
>>>> >> >> that,
>>>> >> >> we now build a CFG of any function that uses a '[[fallthrough]];'
>>>> >> >> statement
>>>> >> >> to check.
>>>> >> >>
>>>> >> >> In passing, fix some bugs with our support for statement
>>>> >> >> attributes --
>>>> >> >> in
>>>> >> >> particular, diagnose their use on declarations, rather than
>>>> >> >> asserting.
>>>> >> >>
>>>> >> >> Modified:
>>>> >> >> cfe/trunk/include/clang/AST/Attr.h
>>>> >> >> cfe/trunk/include/clang/Basic/Attr.td
>>>> >> >> cfe/trunk/include/clang/Basic/AttrDocs.td
>>>> >> >> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>> >> >> cfe/trunk/include/clang/Sema/AttributeList.h
>>>> >> >> cfe/trunk/include/clang/Sema/ScopeInfo.h
>>>> >> >> cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
>>>> >> >> cfe/trunk/lib/Sema/AttributeList.cpp
>>>> >> >> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>>>> >> >> cfe/trunk/lib/Sema/SemaStmtAttr.cpp
>>>> >> >> cfe/trunk/test/Analysis/cxx11-crashes.cpp
>>>> >> >> cfe/trunk/test/PCH/Inputs/cxx11-statement-attributes.h
>>>> >> >> cfe/trunk/test/PCH/cxx11-statement-attributes.cpp
>>>> >> >> cfe/trunk/test/Parser/cxx0x-attributes.cpp
>>>> >> >> cfe/trunk/test/SemaCXX/for-range-examples.cpp
>>>> >> >> cfe/trunk/test/SemaCXX/generalized-deprecated.cpp
>>>> >> >> cfe/trunk/test/SemaCXX/nodiscard.cpp
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-macro.cpp
>>>> >> >>
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-per-method.cpp
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp
>>>> >> >> cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
>>>> >> >> cfe/trunk/www/cxx_status.html
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/AST/Attr.h
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/AST/Attr.h (original)
>>>> >> >> +++ cfe/trunk/include/clang/AST/Attr.h Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -118,6 +118,19 @@ public:
>>>> >> >> bool duplicatesAllowed() const { return DuplicatesAllowed; }
>>>> >> >> };
>>>> >> >>
>>>> >> >> +class StmtAttr : public Attr {
>>>> >> >> +protected:
>>>> >> >> + StmtAttr(attr::Kind AK, SourceRange R, unsigned
>>>> >> >> SpellingListIndex,
>>>> >> >> + bool IsLateParsed, bool DuplicatesAllowed)
>>>> >> >> + : Attr(AK, R, SpellingListIndex, IsLateParsed,
>>>> >> >> DuplicatesAllowed)
>>>> >> >> {}
>>>> >> >> +
>>>> >> >> +public:
>>>> >> >> + static bool classof(const Attr *A) {
>>>> >> >> + return A->getKind() >= attr::FirstStmtAttr &&
>>>> >> >> + A->getKind() <= attr::LastStmtAttr;
>>>> >> >> + }
>>>> >> >> +};
>>>> >> >> +
>>>> >> >> class InheritableAttr : public Attr {
>>>> >> >> protected:
>>>> >> >> InheritableAttr(attr::Kind AK, SourceRange R, unsigned
>>>> >> >> SpellingListIndex,
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/Basic/Attr.td
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/Basic/Attr.td (original)
>>>> >> >> +++ cfe/trunk/include/clang/Basic/Attr.td Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -311,6 +311,9 @@ class TypeAttr : Attr {
>>>> >> >> let ASTNode = 0;
>>>> >> >> }
>>>> >> >>
>>>> >> >> +/// A stmt attribute is not processed on a declaration or a type.
>>>> >> >> +class StmtAttr : Attr;
>>>> >> >> +
>>>> >> >> /// An inheritable attribute is inherited by later
>>>> >> >> redeclarations.
>>>> >> >> class InheritableAttr : Attr;
>>>> >> >>
>>>> >> >> @@ -738,8 +741,9 @@ def ExtVectorType : Attr {
>>>> >> >> let Documentation = [Undocumented];
>>>> >> >> }
>>>> >> >>
>>>> >> >> -def FallThrough : Attr {
>>>> >> >> - let Spellings = [CXX11<"clang", "fallthrough">];
>>>> >> >> +def FallThrough : StmtAttr {
>>>> >> >> + let Spellings = [CXX11<"", "fallthrough", 201503>,
>>>> >> >> + CXX11<"clang", "fallthrough">];
>>>> >> >> // let Subjects = [NullStmt];
>>>> >> >> let Documentation = [FallthroughDocs];
>>>> >> >> }
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/Basic/AttrDocs.td
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrDocs.td?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/Basic/AttrDocs.td (original)
>>>> >> >> +++ cfe/trunk/include/clang/Basic/AttrDocs.td Mon Mar 7 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -756,9 +756,10 @@ potentially-evaluated discarded-value ex
>>>> >> >>
>>>> >> >> def FallthroughDocs : Documentation {
>>>> >> >> let Category = DocCatStmt;
>>>> >> >> + let Heading = "fallthrough, clang::fallthrough";
>>>> >> >> let Content = [{
>>>> >> >> -The ``clang::fallthrough`` attribute is used along with the
>>>> >> >> -``-Wimplicit-fallthrough`` argument to annotate intentional
>>>> >> >> fall-through
>>>> >> >> +The ``fallthrough`` (or ``clang::fallthrough``) attribute is used
>>>> >> >> +to annotate intentional fall-through
>>>> >> >> between switch labels. It can only be applied to a null
>>>> >> >> statement
>>>> >> >> placed
>>>> >> >> at a
>>>> >> >> point of execution between any statement and the next switch
>>>> >> >> label.
>>>> >> >> It
>>>> >> >> is
>>>> >> >> common to mark these places with a specific comment, but this
>>>> >> >> attribute
>>>> >> >> is
>>>> >> >> @@ -769,6 +770,10 @@ control-flow statements like ``break;``,
>>>> >> >> where ``break;`` can, but only if there are no statements on the
>>>> >> >> execution path
>>>> >> >> between it and the next switch label.
>>>> >> >>
>>>> >> >> +By default, Clang does not warn on unannotated fallthrough from
>>>> >> >> one
>>>> >> >> ``switch``
>>>> >> >> +case to another. Diagnostics on fallthrough without a
>>>> >> >> corresponding
>>>> >> >> annotation
>>>> >> >> +can be enabled with the ``-Wimplicit-fallthrough`` argument.
>>>> >> >> +
>>>> >> >> Here is an example:
>>>> >> >>
>>>> >> >> .. code-block:: c++
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>> >> >> (original)
>>>> >> >> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Mar
>>>> >> >> 7
>>>> >> >> 18:32:55 2016
>>>> >> >> @@ -2358,8 +2358,10 @@ def warn_cxx11_gnu_attribute_on_type : W
>>>> >> >> def warn_unhandled_ms_attribute_ignored : Warning<
>>>> >> >> "__declspec attribute %0 is not supported">,
>>>> >> >> InGroup<IgnoredAttributes>;
>>>> >> >> -def err_attribute_invalid_on_stmt : Error<
>>>> >> >> +def err_decl_attribute_invalid_on_stmt : Error<
>>>> >> >> "%0 attribute cannot be applied to a statement">;
>>>> >> >> +def err_stmt_attribute_invalid_on_decl : Error<
>>>> >> >> + "%0 attribute cannot be applied to a declaration">;
>>>> >> >> def warn_declspec_attribute_ignored : Warning<
>>>> >> >> "attribute %0 is ignored, place it after "
>>>> >> >> "\"%select{class|struct|interface|union|enum}1\" to apply
>>>> >> >> attribute
>>>> >> >> to
>>>> >> >> "
>>>> >> >> @@ -6592,8 +6594,11 @@ def warn_unused_result : Warning<
>>>> >> >> def warn_unused_volatile : Warning<
>>>> >> >> "expression result unused; assign into a variable to force a
>>>> >> >> volatile
>>>> >> >> load">,
>>>> >> >> InGroup<DiagGroup<"unused-volatile-lvalue">>;
>>>> >> >> -def ext_nodiscard_attr_is_a_cxx1z_extension : ExtWarn<
>>>> >> >> - "use of the 'nodiscard' attribute is a C++1z extension">,
>>>> >> >> InGroup<CXX1z>;
>>>> >> >> +
>>>> >> >> +def ext_cxx14_attr : Extension<
>>>> >> >> + "use of the %0 attribute is a C++14 extension">,
>>>> >> >> InGroup<CXX14>;
>>>> >> >> +def ext_cxx1z_attr : Extension<
>>>> >> >> + "use of the %0 attribute is a C++1z extension">,
>>>> >> >> InGroup<CXX1z>;
>>>> >> >>
>>>> >> >> def warn_unused_comparison : Warning<
>>>> >> >> "%select{%select{|in}1equality|relational}0 comparison result
>>>> >> >> unused">,
>>>> >> >> @@ -7306,13 +7311,12 @@ def note_insert_fallthrough_fixit : Note
>>>> >> >> def note_insert_break_fixit : Note<
>>>> >> >> "insert 'break;' to avoid fall-through">;
>>>> >> >> def err_fallthrough_attr_wrong_target : Error<
>>>> >> >> - "clang::fallthrough attribute is only allowed on empty
>>>> >> >> statements">;
>>>> >> >> + "%0 attribute is only allowed on empty statements">;
>>>> >> >> def note_fallthrough_insert_semi_fixit : Note<"did you forget
>>>> >> >> ';'?">;
>>>> >> >> def err_fallthrough_attr_outside_switch : Error<
>>>> >> >> "fallthrough annotation is outside switch statement">;
>>>> >> >> -def warn_fallthrough_attr_invalid_placement : Warning<
>>>> >> >> - "fallthrough annotation does not directly precede switch
>>>> >> >> label">,
>>>> >> >> - InGroup<ImplicitFallthrough>;
>>>> >> >> +def err_fallthrough_attr_invalid_placement : Error<
>>>> >> >> + "fallthrough annotation does not directly precede switch
>>>> >> >> label">;
>>>> >> >> def warn_fallthrough_attr_unreachable : Warning<
>>>> >> >> "fallthrough annotation in unreachable code">,
>>>> >> >> InGroup<ImplicitFallthrough>;
>>>> >> >> @@ -7678,9 +7682,6 @@ def err_asm_naked_this_ref : Error<
>>>> >> >> def err_asm_naked_parm_ref : Error<
>>>> >> >> "parameter references not allowed in naked functions">;
>>>> >> >>
>>>> >> >> -def ext_deprecated_attr_is_a_cxx14_extension : ExtWarn<
>>>> >> >> - "use of the 'deprecated' attribute is a C++14 extension">,
>>>> >> >> InGroup<CXX14>;
>>>> >> >> -
>>>> >> >> // OpenCL warnings and errors.
>>>> >> >> def err_invalid_astype_of_different_size : Error<
>>>> >> >> "invalid reinterpretation: sizes of %0 and %1 must match">;
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/Sema/AttributeList.h
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/Sema/AttributeList.h (original)
>>>> >> >> +++ cfe/trunk/include/clang/Sema/AttributeList.h Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -491,6 +491,7 @@ public:
>>>> >> >>
>>>> >> >> bool isTargetSpecificAttr() const;
>>>> >> >> bool isTypeAttr() const;
>>>> >> >> + bool isStmtAttr() const;
>>>> >> >>
>>>> >> >> bool hasCustomParsing() const;
>>>> >> >> unsigned getMinArgs() const;
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/include/clang/Sema/ScopeInfo.h
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/ScopeInfo.h?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/include/clang/Sema/ScopeInfo.h (original)
>>>> >> >> +++ cfe/trunk/include/clang/Sema/ScopeInfo.h Mon Mar 7 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -107,6 +107,9 @@ public:
>>>> >> >> /// \brief True if current scope is for OpenMP declare
>>>> >> >> reduction
>>>> >> >> combiner.
>>>> >> >> bool HasOMPDeclareReductionCombiner;
>>>> >> >>
>>>> >> >> + /// \brief Whether there is a fallthrough statement in this
>>>> >> >> function.
>>>> >> >> + bool HasFallthroughStmt : 1;
>>>> >> >> +
>>>> >> >> /// A flag that is set when parsing a method that must call
>>>> >> >> super's
>>>> >> >> /// implementation, such as \c -dealloc, \c -finalize, or any
>>>> >> >> method
>>>> >> >> marked
>>>> >> >> /// with \c __attribute__((objc_requires_super)).
>>>> >> >> @@ -348,6 +351,10 @@ public:
>>>> >> >> HasOMPDeclareReductionCombiner = true;
>>>> >> >> }
>>>> >> >>
>>>> >> >> + void setHasFallthroughStmt() {
>>>> >> >> + HasFallthroughStmt = true;
>>>> >> >> + }
>>>> >> >> +
>>>> >> >> void setHasCXXTry(SourceLocation TryLoc) {
>>>> >> >> setHasBranchProtectedScope();
>>>> >> >> FirstCXXTryLoc = TryLoc;
>>>> >> >> @@ -371,6 +378,7 @@ public:
>>>> >> >> HasIndirectGoto(false),
>>>> >> >> HasDroppedStmt(false),
>>>> >> >> HasOMPDeclareReductionCombiner(false),
>>>> >> >> + HasFallthroughStmt(false),
>>>> >> >> ObjCShouldCallSuper(false),
>>>> >> >> ObjCIsDesignatedInit(false),
>>>> >> >> ObjCWarnForNoDesignatedInitChain(false),
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
>>>> >> >> +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1071,6 +1071,34 @@ namespace {
>>>> >> >> };
>>>> >> >> } // anonymous namespace
>>>> >> >>
>>>> >> >> +static StringRef getFallthroughAttrSpelling(Preprocessor &PP,
>>>> >> >> + SourceLocation Loc) {
>>>> >> >> + TokenValue FallthroughTokens[] = {
>>>> >> >> + tok::l_square, tok::l_square,
>>>> >> >> + PP.getIdentifierInfo("fallthrough"),
>>>> >> >> + tok::r_square, tok::r_square
>>>> >> >> + };
>>>> >> >> +
>>>> >> >> + TokenValue ClangFallthroughTokens[] = {
>>>> >> >> + tok::l_square, tok::l_square, PP.getIdentifierInfo("clang"),
>>>> >> >> + tok::coloncolon, PP.getIdentifierInfo("fallthrough"),
>>>> >> >> + tok::r_square, tok::r_square
>>>> >> >> + };
>>>> >> >> +
>>>> >> >> + bool PreferClangAttr = !PP.getLangOpts().CPlusPlus1z;
>>>> >> >> +
>>>> >> >> + StringRef MacroName;
>>>> >> >> + if (PreferClangAttr)
>>>> >> >> + MacroName = PP.getLastMacroWithSpelling(Loc,
>>>> >> >> ClangFallthroughTokens);
>>>> >> >> + if (MacroName.empty())
>>>> >> >> + MacroName = PP.getLastMacroWithSpelling(Loc,
>>>> >> >> FallthroughTokens);
>>>> >> >> + if (MacroName.empty() && !PreferClangAttr)
>>>> >> >> + MacroName = PP.getLastMacroWithSpelling(Loc,
>>>> >> >> ClangFallthroughTokens);
>>>> >> >> + if (MacroName.empty())
>>>> >> >> + MacroName = PreferClangAttr ? "[[clang::fallthrough]]" :
>>>> >> >> "[[fallthrough]]";
>>>> >> >> + return MacroName;
>>>> >> >> +}
>>>> >> >> +
>>>> >> >> static void DiagnoseSwitchLabelsFallthrough(Sema &S,
>>>> >> >> AnalysisDeclContext
>>>> >> >> &AC,
>>>> >> >> bool PerFunction) {
>>>> >> >> // Only perform this analysis when using C++11. There is no
>>>> >> >> good
>>>> >> >> workflow
>>>> >> >> @@ -1129,15 +1157,7 @@ static void DiagnoseSwitchLabelsFallthro
>>>> >> >> }
>>>> >> >> if (!(B->empty() && Term && isa<BreakStmt>(Term))) {
>>>> >> >> Preprocessor &PP = S.getPreprocessor();
>>>> >> >> - TokenValue Tokens[] = {
>>>> >> >> - tok::l_square, tok::l_square,
>>>> >> >> PP.getIdentifierInfo("clang"),
>>>> >> >> - tok::coloncolon, PP.getIdentifierInfo("fallthrough"),
>>>> >> >> - tok::r_square, tok::r_square
>>>> >> >> - };
>>>> >> >> - StringRef AnnotationSpelling =
>>>> >> >> "[[clang::fallthrough]]";
>>>> >> >> - StringRef MacroName = PP.getLastMacroWithSpelling(L,
>>>> >> >> Tokens);
>>>> >> >> - if (!MacroName.empty())
>>>> >> >> - AnnotationSpelling = MacroName;
>>>> >> >> + StringRef AnnotationSpelling =
>>>> >> >> getFallthroughAttrSpelling(PP,
>>>> >> >> L);
>>>> >> >> SmallString<64> TextToInsert(AnnotationSpelling);
>>>> >> >> TextToInsert += "; ";
>>>> >> >> S.Diag(L, diag::note_insert_fallthrough_fixit) <<
>>>> >> >> @@ -1151,7 +1171,7 @@ static void DiagnoseSwitchLabelsFallthro
>>>> >> >> }
>>>> >> >>
>>>> >> >> for (const auto *F : FM.getFallthroughStmts())
>>>> >> >> - S.Diag(F->getLocStart(),
>>>> >> >> diag::warn_fallthrough_attr_invalid_placement);
>>>> >> >> + S.Diag(F->getLocStart(),
>>>> >> >> diag::err_fallthrough_attr_invalid_placement);
>>>> >> >> }
>>>> >> >>
>>>> >> >> static bool isInLoop(const ASTContext &Ctx, const ParentMap &PM,
>>>> >> >> @@ -2038,7 +2058,8 @@ AnalysisBasedWarnings::IssueWarnings(sem
>>>> >> >> !Diags.isIgnored(diag::warn_unannotated_fallthrough,
>>>> >> >> D->getLocStart());
>>>> >> >> bool FallThroughDiagPerFunction = !Diags.isIgnored(
>>>> >> >> diag::warn_unannotated_fallthrough_per_function,
>>>> >> >> D->getLocStart());
>>>> >> >> - if (FallThroughDiagFull || FallThroughDiagPerFunction) {
>>>> >> >> + if (FallThroughDiagFull || FallThroughDiagPerFunction ||
>>>> >> >> + fscope->HasFallthroughStmt) {
>>>> >> >> DiagnoseSwitchLabelsFallthrough(S, AC, !FallThroughDiagFull);
>>>> >> >> }
>>>> >> >>
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/lib/Sema/AttributeList.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AttributeList.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/lib/Sema/AttributeList.cpp (original)
>>>> >> >> +++ cfe/trunk/lib/Sema/AttributeList.cpp Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -159,6 +159,7 @@ struct ParsedAttrInfo {
>>>> >> >> unsigned HasCustomParsing : 1;
>>>> >> >> unsigned IsTargetSpecific : 1;
>>>> >> >> unsigned IsType : 1;
>>>> >> >> + unsigned IsStmt : 1;
>>>> >> >> unsigned IsKnownToGCC : 1;
>>>> >> >>
>>>> >> >> bool (*DiagAppertainsToDecl)(Sema &S, const AttributeList
>>>> >> >> &Attr,
>>>> >> >> @@ -204,6 +205,10 @@ bool AttributeList::isTypeAttr() const {
>>>> >> >> return getInfo(*this).IsType;
>>>> >> >> }
>>>> >> >>
>>>> >> >> +bool AttributeList::isStmtAttr() const {
>>>> >> >> + return getInfo(*this).IsStmt;
>>>> >> >> +}
>>>> >> >> +
>>>> >> >> bool AttributeList::existsInTarget(const TargetInfo &Target)
>>>> >> >> const {
>>>> >> >> return getInfo(*this).ExistsInTarget(Target);
>>>> >> >> }
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
>>>> >> >> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -2467,7 +2467,7 @@ static void handleWarnUnusedResult(Sema
>>>> >> >> // about using it as an extension.
>>>> >> >> if (!S.getLangOpts().CPlusPlus1z && Attr.isCXX11Attribute() &&
>>>> >> >> !Attr.getScopeName())
>>>> >> >> - S.Diag(Attr.getLoc(),
>>>> >> >> diag::ext_nodiscard_attr_is_a_cxx1z_extension);
>>>> >> >> + S.Diag(Attr.getLoc(), diag::ext_cxx1z_attr) <<
>>>> >> >> Attr.getName();
>>>> >> >>
>>>> >> >> D->addAttr(::new (S.Context)
>>>> >> >> WarnUnusedResultAttr(Attr.getRange(), S.Context,
>>>> >> >> @@ -5072,7 +5072,7 @@ static void handleDeprecatedAttr(Sema &S
>>>> >> >> if (!S.getLangOpts().CPlusPlus14)
>>>> >> >> if (Attr.isCXX11Attribute() &&
>>>> >> >> !(Attr.hasScope() && Attr.getScopeName()->isStr("gnu")))
>>>> >> >> - S.Diag(Attr.getLoc(),
>>>> >> >> diag::ext_deprecated_attr_is_a_cxx14_extension);
>>>> >> >> + S.Diag(Attr.getLoc(), diag::ext_cxx14_attr) <<
>>>> >> >> Attr.getName();
>>>> >> >>
>>>> >> >> handleAttrWithMessage<DeprecatedAttr>(S, D, Attr);
>>>> >> >> }
>>>> >> >> @@ -5234,8 +5234,13 @@ static void ProcessDeclAttribute(Sema &S
>>>> >> >>
>>>> >> >> switch (Attr.getKind()) {
>>>> >> >> default:
>>>> >> >> - // Type attributes are handled elsewhere; silently move on.
>>>> >> >> - assert(Attr.isTypeAttr() && "Non-type attribute not
>>>> >> >> handled");
>>>> >> >> + if (!Attr.isStmtAttr()) {
>>>> >> >> + // Type attributes are handled elsewhere; silently move on.
>>>> >> >> + assert(Attr.isTypeAttr() && "Non-type attribute not
>>>> >> >> handled");
>>>> >> >> + break;
>>>> >> >> + }
>>>> >> >> + S.Diag(Attr.getLoc(),
>>>> >> >> diag::err_stmt_attribute_invalid_on_decl)
>>>> >> >> + << Attr.getName() << D->getLocation();
>>>> >> >> break;
>>>> >> >> case AttributeList::AT_Interrupt:
>>>> >> >> handleInterruptAttr(S, D, Attr);
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/lib/Sema/SemaStmtAttr.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAttr.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/lib/Sema/SemaStmtAttr.cpp (original)
>>>> >> >> +++ cfe/trunk/lib/Sema/SemaStmtAttr.cpp Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -25,9 +25,11 @@ using namespace sema;
>>>> >> >>
>>>> >> >> static Attr *handleFallThroughAttr(Sema &S, Stmt *St, const
>>>> >> >> AttributeList
>>>> >> >> &A,
>>>> >> >> SourceRange Range) {
>>>> >> >> + FallThroughAttr Attr(A.getRange(), S.Context,
>>>> >> >> + A.getAttributeSpellingListIndex());
>>>> >> >> if (!isa<NullStmt>(St)) {
>>>> >> >> S.Diag(A.getRange().getBegin(),
>>>> >> >> diag::err_fallthrough_attr_wrong_target)
>>>> >> >> - << St->getLocStart();
>>>> >> >> + << Attr.getSpelling() << St->getLocStart();
>>>> >> >> if (isa<SwitchCase>(St)) {
>>>> >> >> SourceLocation L = S.getLocForEndOfToken(Range.getEnd());
>>>> >> >> S.Diag(L, diag::note_fallthrough_insert_semi_fixit)
>>>> >> >> @@ -35,12 +37,20 @@ static Attr *handleFallThroughAttr(Sema
>>>> >> >> }
>>>> >> >> return nullptr;
>>>> >> >> }
>>>> >> >> - if (S.getCurFunction()->SwitchStack.empty()) {
>>>> >> >> + auto *FnScope = S.getCurFunction();
>>>> >> >> + if (FnScope->SwitchStack.empty()) {
>>>> >> >> S.Diag(A.getRange().getBegin(),
>>>> >> >> diag::err_fallthrough_attr_outside_switch);
>>>> >> >> return nullptr;
>>>> >> >> }
>>>> >> >> - return ::new (S.Context) FallThroughAttr(A.getRange(),
>>>> >> >> S.Context,
>>>> >> >> -
>>>> >> >> A.getAttributeSpellingListIndex());
>>>> >> >> +
>>>> >> >> + // If this is spelled as the standard C++1z attribute, but not
>>>> >> >> in
>>>> >> >> C++1z, warn
>>>> >> >> + // about using it as an extension.
>>>> >> >> + if (!S.getLangOpts().CPlusPlus1z && A.isCXX11Attribute() &&
>>>> >> >> + !A.getScopeName())
>>>> >> >> + S.Diag(A.getLoc(), diag::ext_cxx1z_attr) << A.getName();
>>>> >> >> +
>>>> >> >> + FnScope->setHasFallthroughStmt();
>>>> >> >> + return ::new (S.Context) auto(Attr);
>>>> >> >> }
>>>> >> >>
>>>> >> >> static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const
>>>> >> >> AttributeList
>>>> >> >> &A,
>>>> >> >> @@ -266,7 +276,7 @@ static Attr *ProcessStmtAttribute(Sema &
>>>> >> >> default:
>>>> >> >> // if we're here, then we parsed a known attribute, but
>>>> >> >> didn't
>>>> >> >> recognize
>>>> >> >> // it as a statement attribute => it is declaration attribute
>>>> >> >> - S.Diag(A.getRange().getBegin(),
>>>> >> >> diag::err_attribute_invalid_on_stmt)
>>>> >> >> + S.Diag(A.getRange().getBegin(),
>>>> >> >> diag::err_decl_attribute_invalid_on_stmt)
>>>> >> >> << A.getName() << St->getLocStart();
>>>> >> >> return nullptr;
>>>> >> >> }
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/Analysis/cxx11-crashes.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cxx11-crashes.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/Analysis/cxx11-crashes.cpp (original)
>>>> >> >> +++ cfe/trunk/test/Analysis/cxx11-crashes.cpp Mon Mar 7 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1,5 +1,4 @@
>>>> >> >> // RUN: %clang_cc1 -analyze -analyzer-checker=core -std=c++11
>>>> >> >> -verify
>>>> >> >> %s
>>>> >> >> -// expected-no-diagnostics
>>>> >> >>
>>>> >> >> // radar://11485149, PR12871
>>>> >> >> class PlotPoint {
>>>> >> >> @@ -91,6 +90,6 @@ void test() {
>>>> >> >> void fallthrough() {
>>>> >> >> switch (1) {
>>>> >> >> case 1:
>>>> >> >> - [[clang::fallthrough]];
>>>> >> >> + [[clang::fallthrough]]; // expected-error {{does not
>>>> >> >> directly
>>>> >> >> precede}}
>>>> >> >> }
>>>> >> >> }
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/PCH/Inputs/cxx11-statement-attributes.h
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/Inputs/cxx11-statement-attributes.h?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/PCH/Inputs/cxx11-statement-attributes.h
>>>> >> >> (original)
>>>> >> >> +++ cfe/trunk/test/PCH/Inputs/cxx11-statement-attributes.h Mon Mar
>>>> >> >> 7
>>>> >> >> 18:32:55 2016
>>>> >> >> @@ -7,7 +7,8 @@ int f(int n) {
>>>> >> >> [[clang::fallthrough]]; // This shouldn't generate a
>>>> >> >> warning.
>>>> >> >> case 1:
>>>> >> >> n += 20;
>>>> >> >> - [[clang::fallthrough]]; // This should generate a warning:
>>>> >> >> "fallthrough annotation does not directly precede switch label".
>>>> >> >> + case 2: // This should generate a warning: "unannotated
>>>> >> >> fallthrough"
>>>> >> >> + n += 35;
>>>> >> >> break;
>>>> >> >> }
>>>> >> >> return n;
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/PCH/cxx11-statement-attributes.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx11-statement-attributes.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/PCH/cxx11-statement-attributes.cpp (original)
>>>> >> >> +++ cfe/trunk/test/PCH/cxx11-statement-attributes.cpp Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1,10 +1,15 @@
>>>> >> >> // Sanity check.
>>>> >> >> // RUN: %clang_cc1 -include
>>>> >> >> %S/Inputs/cxx11-statement-attributes.h
>>>> >> >> -std=c++11 -Wimplicit-fallthrough -fsyntax-only %s -o - -verify
>>>> >> >> +// RUN: %clang_cc1 -include
>>>> >> >> %S/Inputs/cxx11-statement-attributes.h
>>>> >> >> -std=c++1z -Wimplicit-fallthrough -fsyntax-only %s -o - -verify
>>>> >> >> // Run the same tests, this time with the attributes loaded from
>>>> >> >> the
>>>> >> >> PCH
>>>> >> >> file.
>>>> >> >> // RUN: %clang_cc1 -x c++-header -emit-pch -std=c++11 -o %t
>>>> >> >> %S/Inputs/cxx11-statement-attributes.h
>>>> >> >> // RUN: %clang_cc1 -include-pch %t -std=c++11
>>>> >> >> -Wimplicit-fallthrough
>>>> >> >> -fsyntax-only %s -o - -verify
>>>> >> >> +// RUN: %clang_cc1 -x c++-header -emit-pch -std=c++1z -o %t
>>>> >> >> %S/Inputs/cxx11-statement-attributes.h
>>>> >> >> +// RUN: %clang_cc1 -include-pch %t -std=c++1z
>>>> >> >> -Wimplicit-fallthrough
>>>> >> >> -fsyntax-only %s -o - -verify
>>>> >> >>
>>>> >> >> -// expected-warning at Inputs/cxx11-statement-attributes.h:10
>>>> >> >> {{fallthrough
>>>> >> >> annotation does not directly precede switch label}}
>>>> >> >> +// expected-warning at Inputs/cxx11-statement-attributes.h:10
>>>> >> >> {{unannotated
>>>> >> >> fall-through}}
>>>> >> >> +// expected-note-re at Inputs/cxx11-statement-attributes.h:10
>>>> >> >> {{insert
>>>> >> >> '[[{{(clang::)?}}fallthrough]];'}}
>>>> >> >> +// expected-note at Inputs/cxx11-statement-attributes.h:10 {{insert
>>>> >> >> 'break;'}}
>>>> >> >>
>>>> >> >> void g(int n) {
>>>> >> >> f<1>(n); // expected-note {{in instantiation of function
>>>> >> >> template
>>>> >> >> specialization 'f<1>' requested here}}
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/Parser/cxx0x-attributes.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-attributes.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/Parser/cxx0x-attributes.cpp (original)
>>>> >> >> +++ cfe/trunk/test/Parser/cxx0x-attributes.cpp Mon Mar 7 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1,4 +1,4 @@
>>>> >> >> -// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only
>>>> >> >> -verify
>>>> >> >> -std=c++11 -Wc++14-compat %s
>>>> >> >> +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only
>>>> >> >> -verify
>>>> >> >> -std=c++11 -Wc++14-compat -Wc++14-extensions -Wc++1z-extensions %s
>>>> >> >>
>>>> >> >> // Need std::initializer_list
>>>> >> >> namespace std {
>>>> >> >> @@ -347,6 +347,18 @@ deprecated
>>>> >> >> ]] void bad();
>>>> >> >> }
>>>> >> >>
>>>> >> >> +int fallthru(int n) {
>>>> >> >> + switch (n) {
>>>> >> >> + case 0:
>>>> >> >> + n += 5;
>>>> >> >> + [[fallthrough]]; // expected-warning {{use of the
>>>> >> >> 'fallthrough'
>>>> >> >> attribute is a C++1z extension}}
>>>> >> >> + case 1:
>>>> >> >> + n *= 2;
>>>> >> >> + break;
>>>> >> >> + }
>>>> >> >> + return n;
>>>> >> >> +}
>>>> >> >> +
>>>> >> >> #define attr_name bitand
>>>> >> >> #define attr_name_2(x) x
>>>> >> >> #define attr_name_3(x, y) x##y
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/SemaCXX/for-range-examples.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/for-range-examples.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/SemaCXX/for-range-examples.cpp (original)
>>>> >> >> +++ cfe/trunk/test/SemaCXX/for-range-examples.cpp Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -226,7 +226,7 @@ namespace test7 {
>>>> >> >> // we check the alignment attribute before we perform the
>>>> >> >> auto
>>>> >> >> // deduction.
>>>> >> >> for (d alignas(1) : arr) {} // expected-error {{requires type
>>>> >> >> for
>>>> >> >> loop variable}}
>>>> >> >> - for (e [[deprecated]] : arr) { e = 0; } //
>>>> >> >> expected-warning{{use
>>>> >> >> of
>>>> >> >> the 'deprecated' attribute is a C++14 extension}} expected-warning
>>>> >> >> {{deprecated}} expected-note {{here}} expected-error {{requires
>>>> >> >> type
>>>> >> >> for
>>>> >> >> loop variable}}
>>>> >> >> + for (e [[deprecated]] : arr) { e = 0; } // expected-warning
>>>> >> >> {{deprecated}} expected-note {{here}} expected-error {{requires
>>>> >> >> type
>>>> >> >> for
>>>> >> >> loop variable}}
>>>> >> >> }
>>>> >> >> }
>>>> >> >>
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/SemaCXX/generalized-deprecated.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/generalized-deprecated.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/SemaCXX/generalized-deprecated.cpp (original)
>>>> >> >> +++ cfe/trunk/test/SemaCXX/generalized-deprecated.cpp Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1,4 +1,4 @@
>>>> >> >> -// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only
>>>> >> >> -fms-extensions
>>>> >> >> -Wno-deprecated %s
>>>> >> >> +// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only
>>>> >> >> -fms-extensions
>>>> >> >> -Wno-deprecated -Wc++14-extensions %s
>>>> >> >>
>>>> >> >> // NOTE: use -Wno-deprecated to avoid cluttering the output with
>>>> >> >> deprecated
>>>> >> >> // warnings
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/SemaCXX/nodiscard.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/nodiscard.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/SemaCXX/nodiscard.cpp (original)
>>>> >> >> +++ cfe/trunk/test/SemaCXX/nodiscard.cpp Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -1,5 +1,5 @@
>>>> >> >> -// RUN: %clang_cc1 -fsyntax-only -std=c++1z -verify %s
>>>> >> >> -// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify -DEXT %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -std=c++1z -verify
>>>> >> >> -Wc++1z-extensions
>>>> >> >> %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify -DEXT
>>>> >> >> -Wc++1z-extensions %s
>>>> >> >>
>>>> >> >> #if !defined(EXT)
>>>> >> >> static_assert(__has_cpp_attribute(nodiscard) == 201603);
>>>> >> >>
>>>> >> >> Modified:
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-macro.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-macro.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-macro.cpp
>>>> >> >> (original)
>>>> >> >> +++ cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-macro.cpp
>>>> >> >> Mon
>>>> >> >> Mar
>>>> >> >> 7 18:32:55 2016
>>>> >> >> @@ -1,4 +1,8 @@
>>>> >> >> -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11
>>>> >> >> -Wimplicit-fallthrough
>>>> >> >> -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11
>>>> >> >> -Wimplicit-fallthrough -DCLANG_PREFIX
>>>> >> >> -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]]
>>>> >> >> -DUNCHOSEN=[[fallthrough]]
>>>> >> >> %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11
>>>> >> >> -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[fallthrough]]
>>>> >> >> %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z
>>>> >> >> -Wimplicit-fallthrough -DCLANG_PREFIX
>>>> >> >> -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z
>>>> >> >> -Wimplicit-fallthrough
>>>> >> >> -DCOMMAND_LINE_FALLTHROUGH=[[clang::fallthrough]] %s
>>>> >> >> +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z
>>>> >> >> -Wimplicit-fallthrough -DCOMMAND_LINE_FALLTHROUGH=[[fallthrough]]
>>>> >> >> -DUNCHOSEN=[[clang::fallthrough]] %s
>>>> >> >>
>>>> >> >> int fallthrough_compatibility_macro_from_command_line(int n) {
>>>> >> >> switch (n) {
>>>> >> >> @@ -10,15 +14,12 @@ int fallthrough_compatibility_macro_from
>>>> >> >> return n;
>>>> >> >> }
>>>> >> >>
>>>> >> >> -#ifdef __clang__
>>>> >> >> -#if __has_feature(cxx_attributes) &&
>>>> >> >> __has_warning("-Wimplicit-fallthrough")
>>>> >> >> +#ifdef CLANG_PREFIX
>>>> >> >> #define COMPATIBILITY_FALLTHROUGH [ [ /* test */ clang /* test
>>>> >> >> */ \
>>>> >> >> :: fallthrough ] ] // testing whitespace and comments
>>>> >> >> in
>>>> >> >> macro
>>>> >> >> definition
>>>> >> >> -#endif
>>>> >> >> -#endif
>>>> >> >> -
>>>> >> >> -#ifndef COMPATIBILITY_FALLTHROUGH
>>>> >> >> -#define COMPATIBILITY_FALLTHROUGH do { } while (0)
>>>> >> >> +#else
>>>> >> >> +#define COMPATIBILITY_FALLTHROUGH [ [ /* test */ /* test */ \
>>>> >> >> + fallthrough ] ] // testing whitespace and comments in
>>>> >> >> macro
>>>> >> >> definition
>>>> >> >> #endif
>>>> >> >>
>>>> >> >> int fallthrough_compatibility_macro_from_source(int n) {
>>>> >> >> @@ -32,7 +33,11 @@ int fallthrough_compatibility_macro_from
>>>> >> >> }
>>>> >> >>
>>>> >> >> // Deeper macro substitution
>>>> >> >> +#ifdef CLANG_PREFIX
>>>> >> >> #define M1 [[clang::fallthrough]]
>>>> >> >> +#else
>>>> >> >> +#define M1 [[fallthrough]]
>>>> >> >> +#endif
>>>> >> >> #ifdef __clang__
>>>> >> >> #define M2 M1
>>>> >> >> #else
>>>> >> >> @@ -59,12 +64,17 @@ int fallthrough_compatibility_macro_in_m
>>>> >> >> #undef M2
>>>> >> >> #undef COMPATIBILITY_FALLTHROUGH
>>>> >> >> #undef COMMAND_LINE_FALLTHROUGH
>>>> >> >> +#undef UNCHOSEN
>>>> >> >>
>>>> >> >> int fallthrough_compatibility_macro_undefined(int n) {
>>>> >> >> switch (n) {
>>>> >> >> case 0:
>>>> >> >> n = n * 20;
>>>> >> >> +#if __cplusplus <= 201402L
>>>> >> >> case 1: // expected-warning{{unannotated fall-through between
>>>> >> >> switch
>>>> >> >> labels}} expected-note{{insert '[[clang::fallthrough]];' to
>>>> >> >> silence
>>>> >> >> this
>>>> >> >> warning}} expected-note{{insert 'break;' to avoid fall-through}}
>>>> >> >> +#else
>>>> >> >> + case 1: // expected-warning{{unannotated fall-through between
>>>> >> >> switch
>>>> >> >> labels}} expected-note{{insert '[[fallthrough]];' to silence this
>>>> >> >> warning}}
>>>> >> >> expected-note{{insert 'break;' to avoid fall-through}}
>>>> >> >> +#endif
>>>> >> >> ;
>>>> >> >> }
>>>> >> >> #define TOO_LATE [[clang::fallthrough]]
>>>> >> >> @@ -83,7 +93,11 @@ int fallthrough_compatibility_macro_hist
>>>> >> >> case 0:
>>>> >> >> n = n * 20;
>>>> >> >> #undef MACRO_WITH_HISTORY
>>>> >> >> +#if __cplusplus <= 201402L
>>>> >> >> case 1: // expected-warning{{unannotated fall-through between
>>>> >> >> switch
>>>> >> >> labels}} expected-note{{insert '[[clang::fallthrough]];' to
>>>> >> >> silence
>>>> >> >> this
>>>> >> >> warning}} expected-note{{insert 'break;' to avoid fall-through}}
>>>> >> >> +#else
>>>> >> >> + case 1: // expected-warning{{unannotated fall-through between
>>>> >> >> switch
>>>> >> >> labels}} expected-note{{insert '[[fallthrough]];' to silence this
>>>> >> >> warning}}
>>>> >> >> expected-note{{insert 'break;' to avoid fall-through}}
>>>> >> >> +#endif
>>>> >> >> ;
>>>> >> >> #define MACRO_WITH_HISTORY [[clang::fallthrough]]
>>>> >> >> }
>>>> >> >>
>>>> >> >> Modified:
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-per-method.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-per-method.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> ---
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-per-method.cpp
>>>> >> >> (original)
>>>> >> >> +++
>>>> >> >> cfe/trunk/test/SemaCXX/switch-implicit-fallthrough-per-method.cpp
>>>> >> >> Mon
>>>> >> >> Mar 7 18:32:55 2016
>>>> >> >> @@ -41,9 +41,8 @@ int fallthrough2(int n) {
>>>> >> >> void unscoped(int n) {
>>>> >> >> switch (n % 2) {
>>>> >> >> case 0:
>>>> >> >> - // FIXME: This should be typo-corrected, probably.
>>>> >> >> - [[fallthrough]]; // expected-warning{{unknown attribute
>>>> >> >> 'fallthrough' ignored}}
>>>> >> >> - case 2: // expected-warning{{unannotated fall-through}}
>>>> >> >> expected-note{{clang::fallthrough}} expected-note{{break;}}
>>>> >> >> + [[fallthrough]];
>>>> >> >> + case 2:
>>>> >> >> [[clang::fallthrough]];
>>>> >> >> case 1:
>>>> >> >> break;
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp
>>>> >> >> (original)
>>>> >> >> +++ cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp Mon Mar
>>>> >> >> 7
>>>> >> >> 18:32:55 2016
>>>> >> >> @@ -179,18 +179,15 @@ void fallthrough_cfgblock_with_null_succ
>>>> >> >>
>>>> >> >> int fallthrough_position(int n) {
>>>> >> >> switch (n) {
>>>> >> >> - [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation does not directly precede switch label}}
>>>> >> >> n += 300;
>>>> >> >> [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation in unreachable code}}
>>>> >> >> case 221:
>>>> >> >> - [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation does not directly precede switch label}}
>>>> >> >> return 1;
>>>> >> >> [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation in unreachable code}}
>>>> >> >> case 222:
>>>> >> >> - [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation does not directly precede switch label}}
>>>> >> >> n += 400;
>>>> >> >> case 223: // expected-warning{{unannotated
>>>> >> >> fall-through
>>>> >> >> between switch labels}} expected-note{{insert
>>>> >> >> '[[clang::fallthrough]];'
>>>> >> >> to
>>>> >> >> silence this warning}} expected-note{{insert 'break;' to avoid
>>>> >> >> fall-through}}
>>>> >> >> - [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation
>>>> >> >> does not directly precede switch label}}
>>>> >> >> + ;
>>>> >> >> }
>>>> >> >>
>>>> >> >> long p = static_cast<long>(n) * n;
>>>> >> >> @@ -282,6 +279,23 @@ namespace PR18983 {
>>>> >> >> }
>>>> >> >> }
>>>> >> >>
>>>> >> >> +int fallthrough_placement_error(int n) {
>>>> >> >> + switch (n) {
>>>> >> >> + [[clang::fallthrough]]; // expected-warning{{fallthrough
>>>> >> >> annotation
>>>> >> >> in unreachable code}}
>>>> >> >> + n += 300;
>>>> >> >> + case 221:
>>>> >> >> + [[clang::fallthrough]]; // expected-error{{fallthrough
>>>> >> >> annotation
>>>> >> >> does not directly precede switch label}}
>>>> >> >> + return 1;
>>>> >> >> + case 222:
>>>> >> >> + [[clang::fallthrough]]; // expected-error{{fallthrough
>>>> >> >> annotation
>>>> >> >> does not directly precede switch label}}
>>>> >> >> + n += 400;
>>>> >> >> + [[clang::fallthrough]];
>>>> >> >> + case 223:
>>>> >> >> + [[clang::fallthrough]]; // expected-error{{fallthrough
>>>> >> >> annotation
>>>> >> >> does not directly precede switch label}}
>>>> >> >> + }
>>>> >> >> + return n;
>>>> >> >> +}
>>>> >> >> +
>>>> >> >> int fallthrough_targets(int n) {
>>>> >> >> [[clang::fallthrough]]; // expected-error{{fallthrough
>>>> >> >> annotation is
>>>> >> >> outside switch statement}}
>>>> >> >>
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
>>>> >> >> +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Mon Mar 7
>>>> >> >> 18:32:55
>>>> >> >> 2016
>>>> >> >> @@ -1761,6 +1761,7 @@ namespace {
>>>> >> >>
>>>> >> >> static const AttrClassDescriptor AttrClassDescriptors[] = {
>>>> >> >> { "ATTR", "Attr" },
>>>> >> >> + { "STMT_ATTR", "StmtAttr" },
>>>> >> >> { "INHERITABLE_ATTR", "InheritableAttr" },
>>>> >> >> { "INHERITABLE_PARAM_ATTR", "InheritableParamAttr" },
>>>> >> >> { "PARAMETER_ABI_ATTR", "ParameterABIAttr" }
>>>> >> >> @@ -2806,6 +2807,7 @@ void EmitClangAttrParsedAttrImpl(RecordK
>>>> >> >> SS << ", " << I->second->getValueAsBit("HasCustomParsing");
>>>> >> >> SS << ", " << I->second->isSubClassOf("TargetSpecificAttr");
>>>> >> >> SS << ", " << I->second->isSubClassOf("TypeAttr");
>>>> >> >> + SS << ", " << I->second->isSubClassOf("StmtAttr");
>>>> >> >> SS << ", " << IsKnownToGCC(*I->second);
>>>> >> >> SS << ", " << GenerateAppertainsTo(*I->second, OS);
>>>> >> >> SS << ", " << GenerateLangOptRequirements(*I->second, OS);
>>>> >> >>
>>>> >> >> Modified: cfe/trunk/www/cxx_status.html
>>>> >> >> URL:
>>>> >> >>
>>>> >> >>
>>>> >> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=262881&r1=262880&r2=262881&view=diff
>>>> >> >>
>>>> >> >>
>>>> >> >>
>>>> >> >> ==============================================================================
>>>> >> >> --- cfe/trunk/www/cxx_status.html (original)
>>>> >> >> +++ cfe/trunk/www/cxx_status.html Mon Mar 7 18:32:55 2016
>>>> >> >> @@ -629,7 +629,7 @@ as the draft C++1z standard evolves.</p>
>>>> >> >> <tr>
>>>> >> >> <td><tt>[[fallthrough]]</tt> attribute</td>
>>>> >> >> <td><a href="http://wg21.link/p0188r1">P0188R1</a></td>
>>>> >> >> - <td class="none" align="center">No</td>
>>>> >> >> + <td class="full" align="center">SVN</td>
>>>> >> >> </tr>
>>>> >> >> <tr>
>>>> >> >> <td><tt>[[nodiscard]]</tt> attribute</td>
>>>> >> >>
>>>> >> >>
>>>> >> >> _______________________________________________
>>>> >> >> cfe-commits mailing list
>>>> >> >> cfe-commits at lists.llvm.org
>>>> >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>> >> >
>>>> >> >
>>>> >
>>>> >
>>>
>>>
>>
>
More information about the cfe-commits
mailing list