lang_unspecified,
lang_c89, lang_c94, lang_c99,
lang_gnu89, lang_gnu99,
- lang_cxx98, lang_gnucxx98
+ lang_cxx98, lang_gnucxx98,
+ lang_cxx0x, lang_gnucxx0x
};
static llvm::cl::opt<LangStds>
clEnumValN(lang_gnucxx98, "gnu++98",
"ISO C++ 1998 with amendments and GNU "
"extensions (default for C++)"),
+ clEnumValN(lang_cxx0x, "c++0x",
+ "Upcoming ISO C++ 200x with amendments"),
+ clEnumValN(lang_gnucxx0x, "gnu++0x",
+ "Upcoming ISO C++ 200x with amendments and GNU "
+ "extensions (default for C++)"),
clEnumValEnd));
static llvm::cl::opt<bool>
// Fall through from newer standards to older ones. This isn't really right.
// FIXME: Enable specifically the right features based on the language stds.
+ case lang_gnucxx0x:
+ case lang_cxx0x:
+ Options.CPlusPlus0x = 1;
+ // FALL THROUGH
case lang_gnucxx98:
case lang_cxx98:
Options.CPlusPlus = 1;
/// identifiers because they are language keywords. This causes the lexer to
/// automatically map matching identifiers to specialized token codes.
///
-/// The C90/C99/CPP flags are set to 0 if the token should be enabled in the
-/// specified langauge, set to 1 if it is an extension in the specified
-/// language, and set to 2 if disabled in the specified language.
+/// The C90/C99/CPP/CPP0x flags are set to 0 if the token should be
+/// enabled in the specified langauge, set to 1 if it is an extension
+/// in the specified language, and set to 2 if disabled in the
+/// specified language.
static void AddKeyword(const char *Keyword, unsigned KWLen,
tok::TokenKind TokenCode,
- int C90, int C99, int CXX,
+ int C90, int C99, int CXX, int CXX0x,
const LangOptions &LangOpts, IdentifierTable &Table) {
- int Flags = LangOpts.CPlusPlus ? CXX : (LangOpts.C99 ? C99 : C90);
+ int Flags = LangOpts.CPlusPlus ? (LangOpts.CPlusPlus0x? CXX0x : CXX)
+ : (LangOpts.C99 ? C99 : C90);
// Don't add this keyword if disabled in this language or if an extension
// and extensions are disabled.
CPPShift = 4,
EXTCPP = 1 << CPPShift,
NOTCPP = 2 << CPPShift,
+ CPP0xShift = 6,
+ EXTCPP0x = 1 << CPP0xShift,
+ NOTCPP0x = 2 << CPP0xShift,
Mask = 3
};
AddKeyword(#NAME, strlen(#NAME), tok::kw_ ## NAME, \
((FLAGS) >> C90Shift) & Mask, \
((FLAGS) >> C99Shift) & Mask, \
- ((FLAGS) >> CPPShift) & Mask, LangOpts, *this);
+ ((FLAGS) >> CPPShift) & Mask, \
+ ((FLAGS) >> CPP0xShift) & Mask, LangOpts, *this);
#define ALIAS(NAME, TOK) \
AddAlias(NAME, strlen(NAME), #TOK, strlen(#TOK), LangOpts, *this);
#define PPKEYWORD(NAME) \
// EXTC90 - In C90, this token is an extension that is enabled unless strict.
// NOTC99 - In C99, this token is never available.
// EXTC99 - In C99, this token is an extension that is enabled unless strict.
-// NOTCPP - In C++, this token is never available.
-// EXTCPP - In C++, this token is an extension that is enabled unless strict.
+// NOTCPP - In C++98, this token is never available.
+// EXTCPP - In C++98, this token is an extension that is enabled unless strict.
+// NOTCPP0x - In C++0x, this token is never available.
+// EXTCPP0x - In C++0x, this token is an extension that is enabled unless
+// strict.
//
KEYWORD(auto , 0)
KEYWORD(break , 0)
KEYWORD(void , 0)
KEYWORD(volatile , 0)
KEYWORD(while , 0)
-KEYWORD(_Bool , EXTC90|EXTCPP) // C99 only
+KEYWORD(_Bool , EXTC90|EXTCPP|EXTCPP0x) // C99 only
KEYWORD(_Complex , EXTC90) // C99/C++
-KEYWORD(_Imaginary , EXTC90|NOTCPP) // C90 only
+KEYWORD(_Imaginary , EXTC90|NOTCPP|NOTCPP0x) // C90 only
// Special tokens to the compiler.
-KEYWORD(__func__ , EXTC90|EXTCPP) // Only in C99.
-KEYWORD(__FUNCTION__ , EXTC90|EXTC99|EXTCPP) // GCC Extension.
-KEYWORD(__PRETTY_FUNCTION__ , EXTC90|EXTC99|EXTCPP) // GCC Extension.
+KEYWORD(__func__ , EXTC90|EXTCPP|EXTCPP0x) // Only in C99.
+KEYWORD(__FUNCTION__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // GCC Extension.
+KEYWORD(__PRETTY_FUNCTION__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // GCC Extension.
// C++ 2.11p1: Keywords.
KEYWORD(asm , EXTC90|EXTC99) // Exts in C90/C99
CXX_KEYWORD_OPERATOR(xor , caret)
CXX_KEYWORD_OPERATOR(xor_eq , caretequal)
+// C++0x keywords
+KEYWORD(char16_t , NOTC90|NOTC99|NOTCPP)
+KEYWORD(char32_t , NOTC90|NOTC99|NOTCPP)
+KEYWORD(static_assert , NOTC90|NOTC99|NOTCPP)
+
// GNU Extensions.
-KEYWORD(_Decimal32 , EXTC90|EXTC99|EXTCPP)
-KEYWORD(_Decimal64 , EXTC90|EXTC99|EXTCPP)
-KEYWORD(_Decimal128 , EXTC90|EXTC99|EXTCPP)
-KEYWORD(typeof , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__null , NOTC90|NOTC99|EXTCPP) // C++-only Extensn
-KEYWORD(__alignof , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__attribute , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__builtin_choose_expr , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__builtin_offsetof , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__builtin_types_compatible_p, EXTC90|EXTC99|EXTCPP)
-KEYWORD(__builtin_va_arg , EXTC90|EXTC99|EXTCPP)
+KEYWORD(_Decimal32 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(_Decimal64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(_Decimal128 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(typeof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__null , NOTC90|NOTC99|EXTCPP|EXTCPP0x) // C++-only Extensn
+KEYWORD(__alignof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__attribute , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__builtin_choose_expr , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__builtin_offsetof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__builtin_types_compatible_p, EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__builtin_va_arg , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__extension__ , 0) // Not treated as an extension!
-KEYWORD(__imag , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__label__ , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__real , EXTC90|EXTC99|EXTCPP)
-KEYWORD(__thread , EXTC90|EXTC99|EXTCPP)
+KEYWORD(__imag , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__label__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__real , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
+KEYWORD(__thread , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
// Alternate spelling for various tokens. There are GCC extensions in all
// languages, but should not be disabled in strict conformance mode.