Author: rsmith Date: Sun Aug 13 14:32:33 2017 New Revision: 310803 URL: http://llvm.org/viewvc/llvm-project?rev=310803&view=rev Log: [c++2a] Treat 'concept' and 'requires' as keywords, add compat warning for C++17 and before.
Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td cfe/trunk/include/clang/Basic/TokenKinds.def cfe/trunk/lib/Basic/IdentifierTable.cpp cfe/trunk/lib/Lex/Preprocessor.cpp cfe/trunk/test/Lexer/keywords_test.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Sun Aug 13 14:32:33 2017 @@ -224,6 +224,8 @@ def CXX1zCompat : DiagGroup<"c++1z-compa DeprecatedIncrementBool, CXX1zCompatMangling]>; +def CXX2aCompat : DiagGroup<"c++2a-compat">; + def ExitTimeDestructors : DiagGroup<"exit-time-destructors">; def FlexibleArrayExtensions : DiagGroup<"flexible-array-extensions">; def FourByteMultiChar : DiagGroup<"four-char-constants">; Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Sun Aug 13 14:32:33 2017 @@ -71,6 +71,8 @@ def ext_token_used : Extension<"extensio def warn_cxx11_keyword : Warning<"'%0' is a keyword in C++11">, InGroup<CXX11Compat>, DefaultIgnore; +def warn_cxx2a_keyword : Warning<"'%0' is a keyword in C++2a">, + InGroup<CXX2aCompat>, DefaultIgnore; def ext_unterminated_char_or_string : ExtWarn< "missing terminating %select{'|'\"'}0 character">, InGroup<InvalidPPToken>; Modified: cfe/trunk/include/clang/Basic/TokenKinds.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/TokenKinds.def (original) +++ cfe/trunk/include/clang/Basic/TokenKinds.def Sun Aug 13 14:32:33 2017 @@ -27,8 +27,11 @@ #ifndef CXX11_KEYWORD #define CXX11_KEYWORD(X,Y) KEYWORD(X,KEYCXX11|(Y)) #endif +#ifndef CXX2A_KEYWORD +#define CXX2A_KEYWORD(X,Y) KEYWORD(X,KEYCXX2A|(Y)) +#endif #ifndef CONCEPTS_KEYWORD -#define CONCEPTS_KEYWORD(X) KEYWORD(X,KEYCONCEPTS) +#define CONCEPTS_KEYWORD(X) CXX2A_KEYWORD(X,KEYCONCEPTS) #endif #ifndef MODULES_KEYWORD #define MODULES_KEYWORD(X) KEYWORD(X,KEYMODULES) @@ -236,6 +239,7 @@ PUNCTUATOR(caretcaret, "^^") // implementation namespace // KEYNOCXX - This is a keyword in every non-C++ dialect. // KEYCXX11 - This is a C++ keyword introduced to C++ in C++11 +// KEYCXX2A - This is a C++ keyword introduced to C++ in C++2a // KEYCONCEPTS - This is a keyword if the C++ extensions for concepts // are enabled. // KEYMODULES - This is a keyword if the C++ extensions for modules @@ -362,7 +366,7 @@ CXX11_KEYWORD(nullptr , 0) CXX11_KEYWORD(static_assert , 0) CXX11_KEYWORD(thread_local , 0) -// C++ concepts TS keywords +// C++2a / concepts TS keywords CONCEPTS_KEYWORD(concept) CONCEPTS_KEYWORD(requires) @@ -810,6 +814,7 @@ ANNOTATION(module_end) #undef TYPE_TRAIT_1 #undef TYPE_TRAIT #undef CONCEPTS_KEYWORD +#undef CXX2A_KEYWORD #undef CXX11_KEYWORD #undef KEYWORD #undef PUNCTUATOR Modified: cfe/trunk/lib/Basic/IdentifierTable.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/IdentifierTable.cpp?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/lib/Basic/IdentifierTable.cpp (original) +++ cfe/trunk/lib/Basic/IdentifierTable.cpp Sun Aug 13 14:32:33 2017 @@ -114,7 +114,9 @@ namespace { KEYZVECTOR = 0x40000, KEYCOROUTINES = 0x80000, KEYMODULES = 0x100000, - KEYALL = (0x1fffff & ~KEYNOMS18 & + KEYCXX2A = 0x200000, + KEYALLCXX = KEYCXX | KEYCXX11 | KEYCXX2A, + KEYALL = (0x3fffff & ~KEYNOMS18 & ~KEYNOOPENCL) // KEYNOMS18 and KEYNOOPENCL are used to exclude. }; @@ -134,6 +136,7 @@ static KeywordStatus getKeywordStatus(co if (Flags == KEYALL) return KS_Enabled; if (LangOpts.CPlusPlus && (Flags & KEYCXX)) return KS_Enabled; if (LangOpts.CPlusPlus11 && (Flags & KEYCXX11)) return KS_Enabled; + if (LangOpts.CPlusPlus2a && (Flags & KEYCXX2A)) return KS_Enabled; if (LangOpts.C99 && (Flags & KEYC99)) return KS_Enabled; if (LangOpts.GNUKeywords && (Flags & KEYGNU)) return KS_Extension; if (LangOpts.MicrosoftExt && (Flags & KEYMS)) return KS_Extension; @@ -152,7 +155,7 @@ static KeywordStatus getKeywordStatus(co if (LangOpts.ConceptsTS && (Flags & KEYCONCEPTS)) return KS_Enabled; if (LangOpts.CoroutinesTS && (Flags & KEYCOROUTINES)) return KS_Enabled; if (LangOpts.ModulesTS && (Flags & KEYMODULES)) return KS_Enabled; - if (LangOpts.CPlusPlus && (Flags & KEYCXX11)) return KS_Future; + if (LangOpts.CPlusPlus && (Flags & KEYALLCXX)) return KS_Future; return KS_Disabled; } @@ -264,6 +267,7 @@ bool IdentifierInfo::isCPlusPlusKeyword( LangOptions LangOptsNoCPP = LangOpts; LangOptsNoCPP.CPlusPlus = false; LangOptsNoCPP.CPlusPlus11 = false; + LangOptsNoCPP.CPlusPlus2a = false; return !isKeyword(LangOptsNoCPP); } Modified: cfe/trunk/lib/Lex/Preprocessor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) +++ cfe/trunk/lib/Lex/Preprocessor.cpp Sun Aug 13 14:32:33 2017 @@ -630,6 +630,8 @@ static diag::kind getFutureCompatDiagKin return llvm::StringSwitch<diag::kind>(II.getName()) #define CXX11_KEYWORD(NAME, FLAGS) \ .Case(#NAME, diag::warn_cxx11_keyword) +#define CXX2A_KEYWORD(NAME, FLAGS) \ + .Case(#NAME, diag::warn_cxx2a_keyword) #include "clang/Basic/TokenKinds.def" ; Modified: cfe/trunk/test/Lexer/keywords_test.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/keywords_test.cpp?rev=310803&r1=310802&r2=310803&view=diff ============================================================================== --- cfe/trunk/test/Lexer/keywords_test.cpp (original) +++ cfe/trunk/test/Lexer/keywords_test.cpp Sun Aug 13 14:32:33 2017 @@ -1,6 +1,7 @@ // RUN: %clang_cc1 -std=c++03 -fsyntax-only %s // RUN: %clang_cc1 -std=c++11 -DCXX11 -fsyntax-only %s // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -DCXX11 -DCONCEPTS -fsyntax-only %s +// RUN: %clang_cc1 -std=c++2a -DCXX11 -DCXX2A -fsyntax-only %s // RUN: %clang_cc1 -std=c++03 -fdeclspec -DDECLSPEC -fsyntax-only %s // RUN: %clang_cc1 -std=c++03 -fms-extensions -DDECLSPEC -fsyntax-only %s // RUN: %clang_cc1 -std=c++03 -fborland-extensions -DDECLSPEC -fsyntax-only %s @@ -19,7 +20,7 @@ #define NOT_KEYWORD(NAME) _Static_assert(__is_identifier(NAME), #NAME) #define IS_TYPE(NAME) void is_##NAME##_type() { int f(NAME); } -#ifdef CONCEPTS +#if defined(CONCEPTS) || defined(CXX2A) #define CONCEPTS_KEYWORD(NAME) IS_KEYWORD(NAME) #else #define CONCEPTS_KEYWORD(NAME) NOT_KEYWORD(NAME) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits