зеркало из https://github.com/microsoft/clang.git
C1X: add a language standard
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129553 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b38b6a77ab
Коммит
7e7fbd05a5
|
@ -115,6 +115,9 @@ def warn_pch_target_triple : Error<
|
|||
def warn_pch_c99 : Error<
|
||||
"C99 support was %select{disabled|enabled}0 in PCH file but is "
|
||||
"currently %select{disabled|enabled}1">;
|
||||
def warn_pch_c1x : Error<
|
||||
"C1X support was %select{disabled|enabled}0 in PCH file but is "
|
||||
"currently %select{disabled|enabled}1">;
|
||||
def warn_pch_cplusplus : Error<
|
||||
"C++ support was %select{disabled|enabled}0 in PCH file but is "
|
||||
"currently %select{disabled|enabled}1">;
|
||||
|
|
|
@ -34,6 +34,7 @@ public:
|
|||
unsigned Digraphs : 1; // C94, C99 and C++
|
||||
unsigned HexFloats : 1; // C99 Hexadecimal float constants.
|
||||
unsigned C99 : 1; // C99 Support
|
||||
unsigned C1X : 1; // C1X Support
|
||||
unsigned Microsoft : 1; // Microsoft extensions.
|
||||
unsigned Borland : 1; // Borland extensions.
|
||||
unsigned CPlusPlus : 1; // C++ Support
|
||||
|
@ -170,7 +171,7 @@ public:
|
|||
AppleKext = 0;
|
||||
ObjCDefaultSynthProperties = 0;
|
||||
NoConstantCFStrings = 0; InlineVisibilityHidden = 0;
|
||||
C99 = Microsoft = Borland = CPlusPlus = CPlusPlus0x = 0;
|
||||
C99 = C1X = Microsoft = Borland = CPlusPlus = CPlusPlus0x = 0;
|
||||
CXXOperatorNames = PascalStrings = WritableStrings = ConstStrings = 0;
|
||||
Exceptions = ObjCExceptions = CXXExceptions = SjLjExceptions = 0;
|
||||
TraditionalCPP = Freestanding = NoBuiltin = 0;
|
||||
|
|
|
@ -190,6 +190,7 @@ PUNCTUATOR(greatergreatergreater, ">>>")
|
|||
// is a keyword in the implementation namespace that should
|
||||
// always be treated as a keyword
|
||||
// KEYC99 - This is a keyword introduced to C in C99
|
||||
// KEYC1X - This is a keyword introduced to C in C1X
|
||||
// KEYCXX - This is a C++ keyword, or a C++-specific keyword in the
|
||||
// implementation namespace
|
||||
// KEYNOCXX - This is a keyword in every non-C++ dialect.
|
||||
|
|
|
@ -19,12 +19,13 @@ namespace frontend {
|
|||
enum LangFeatures {
|
||||
BCPLComment = (1 << 0),
|
||||
C99 = (1 << 1),
|
||||
CPlusPlus = (1 << 2),
|
||||
CPlusPlus0x = (1 << 3),
|
||||
Digraphs = (1 << 4),
|
||||
GNUMode = (1 << 5),
|
||||
HexFloat = (1 << 6),
|
||||
ImplicitInt = (1 << 7)
|
||||
C1X = (1 << 2),
|
||||
CPlusPlus = (1 << 3),
|
||||
CPlusPlus0x = (1 << 4),
|
||||
Digraphs = (1 << 5),
|
||||
GNUMode = (1 << 6),
|
||||
HexFloat = (1 << 7),
|
||||
ImplicitInt = (1 << 8)
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -56,6 +57,9 @@ public:
|
|||
/// isC99 - Language is a superset of C99.
|
||||
bool isC99() const { return Flags & frontend::C99; }
|
||||
|
||||
/// isC1X - Language is a superset of C1X.
|
||||
bool isC1X() const { return Flags & frontend::C1X; }
|
||||
|
||||
/// isCPlusPlus - Language is a C++ variant.
|
||||
bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; }
|
||||
|
||||
|
|
|
@ -59,6 +59,18 @@ LANGSTANDARD(gnu9x, "gnu9x",
|
|||
"ISO C 1999 with GNU extensions",
|
||||
BCPLComment | C99 | Digraphs | GNUMode | HexFloat)
|
||||
|
||||
// C1X modes
|
||||
LANGSTANDARD(c1x, "c1x",
|
||||
"ISO C 201X",
|
||||
BCPLComment | C99 | C1X | Digraphs | HexFloat)
|
||||
LANGSTANDARD(iso9899_201x,
|
||||
"iso9899:201x", "ISO C 201X",
|
||||
BCPLComment | C99 | C1X | Digraphs | HexFloat)
|
||||
|
||||
LANGSTANDARD(gnu1x, "gnu1x",
|
||||
"ISO C 201X with GNU extensions",
|
||||
BCPLComment | C99 | C1X | Digraphs | GNUMode | HexFloat)
|
||||
|
||||
// C++ modes
|
||||
LANGSTANDARD(cxx98, "c++98",
|
||||
"ISO C++ 1998 with amendments",
|
||||
|
|
|
@ -91,7 +91,8 @@ namespace {
|
|||
KEYNOCXX = 0x80,
|
||||
KEYBORLAND = 0x100,
|
||||
KEYOPENCL = 0x200,
|
||||
KEYALL = 0x3ff
|
||||
KEYC1X = 0x400,
|
||||
KEYALL = 0x7ff
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -118,6 +119,7 @@ static void AddKeyword(llvm::StringRef Keyword,
|
|||
else if (LangOpts.AltiVec && (Flags & KEYALTIVEC)) AddResult = 2;
|
||||
else if (LangOpts.OpenCL && (Flags & KEYOPENCL)) AddResult = 2;
|
||||
else if (!LangOpts.CPlusPlus && (Flags & KEYNOCXX)) AddResult = 2;
|
||||
else if (LangOpts.C1X && (Flags & KEYC1X)) AddResult = 2;
|
||||
|
||||
// Don't add this keyword if disabled in this language.
|
||||
if (AddResult == 0) return;
|
||||
|
|
|
@ -1335,6 +1335,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
|||
const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
|
||||
Opts.BCPLComment = Std.hasBCPLComments();
|
||||
Opts.C99 = Std.isC99();
|
||||
Opts.C1X = Std.isC1X();
|
||||
Opts.CPlusPlus = Std.isCPlusPlus();
|
||||
Opts.CPlusPlus0x = Std.isCPlusPlus0x();
|
||||
Opts.Digraphs = Std.hasDigraphs();
|
||||
|
|
|
@ -79,6 +79,7 @@ PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {
|
|||
PARSE_LANGOPT_BENIGN(Digraphs);
|
||||
PARSE_LANGOPT_BENIGN(HexFloats);
|
||||
PARSE_LANGOPT_IMPORTANT(C99, diag::warn_pch_c99);
|
||||
PARSE_LANGOPT_IMPORTANT(C1X, diag::warn_pch_c1x);
|
||||
PARSE_LANGOPT_IMPORTANT(Microsoft, diag::warn_pch_microsoft_extensions);
|
||||
PARSE_LANGOPT_BENIGN(MSCVersion);
|
||||
PARSE_LANGOPT_IMPORTANT(CPlusPlus, diag::warn_pch_cplusplus);
|
||||
|
@ -2799,6 +2800,7 @@ bool ASTReader::ParseLanguageOptions(
|
|||
PARSE_LANGOPT(Digraphs);
|
||||
PARSE_LANGOPT(HexFloats);
|
||||
PARSE_LANGOPT(C99);
|
||||
PARSE_LANGOPT(C1X);
|
||||
PARSE_LANGOPT(Microsoft);
|
||||
PARSE_LANGOPT(CPlusPlus);
|
||||
PARSE_LANGOPT(CPlusPlus0x);
|
||||
|
|
|
@ -1007,6 +1007,7 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) {
|
|||
Record.push_back(LangOpts.Digraphs); // C94, C99 and C++
|
||||
Record.push_back(LangOpts.HexFloats); // C99 Hexadecimal float constants.
|
||||
Record.push_back(LangOpts.C99); // C99 Support
|
||||
Record.push_back(LangOpts.C1X); // C1X Support
|
||||
Record.push_back(LangOpts.Microsoft); // Microsoft extensions.
|
||||
// LangOpts.MSCVersion is ignored because all it does it set a macro, which is
|
||||
// already saved elsewhere.
|
||||
|
|
Загрузка…
Ссылка в новой задаче