On Tue, Mar 8, 2016 at 12:18 PM, Nico Weber <tha...@chromium.org> wrote:
> On Tue, Mar 8, 2016 at 2:10 PM, Richard Smith <rich...@metafoo.co.uk> > wrote: > >> On Tue, Mar 8, 2016 at 11:04 AM, Nico Weber <tha...@chromium.org> wrote: >> > On Tue, Mar 8, 2016 at 1:49 PM, Richard Smith <rich...@metafoo.co.uk> >> wrote: >> >> >> >> On Tue, Mar 8, 2016 at 9:05 AM, Nico Weber <tha...@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 > > >> (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@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@Inputs/cxx11-statement-attributes.h:10 >> >> >> {{fallthrough >> >> >> annotation does not directly precede switch label}} >> >> >> +// expected-warning@Inputs/cxx11-statement-attributes.h:10 >> >> >> {{unannotated >> >> >> fall-through}} >> >> >> +// expected-note-re@Inputs/cxx11-statement-attributes.h:10 >> {{insert >> >> >> '[[{{(clang::)?}}fallthrough]];'}} >> >> >> +// expected-note@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@lists.llvm.org >> >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> > >> >> > >> > >> > >> > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits