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? > 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