diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-03-18 04:15:23 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-03-18 04:15:23 +0000 |
| commit | 28aae9c29b6dd740c4d8da4b7019f2b83bc446b2 (patch) | |
| tree | 883872fd80aad04f93722c006426f1efb1f75dfd | |
| parent | 91797559acb50c46c77aa200253caefc6acdd11c (diff) | |
| download | bcm5719-llvm-28aae9c29b6dd740c4d8da4b7019f2b83bc446b2.tar.gz bcm5719-llvm-28aae9c29b6dd740c4d8da4b7019f2b83bc446b2.zip | |
MSVC Compat: Permit char16_t, char32_t and _Atomic when targeting > 2013
We disabled support for _Atomic because the STL had name conflicts,
they've been resolved in 2015. Similarly, reenable char16_t and
char32_t.
llvm-svn: 232611
| -rw-r--r-- | clang/include/clang/Basic/TokenKinds.def | 10 | ||||
| -rw-r--r-- | clang/lib/Basic/IdentifierTable.cpp | 7 | ||||
| -rw-r--r-- | clang/test/SemaCXX/MicrosoftCompatibility.cpp | 12 |
3 files changed, 18 insertions, 11 deletions
diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 3319d4ed35e..2382dbf048e 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -225,8 +225,8 @@ PUNCTUATOR(greatergreatergreater, ">>>") // KEYCXX11 - This is a C++ keyword introduced to C++ in C++11 // KEYGNU - This is a keyword if GNU extensions are enabled // KEYMS - This is a keyword if Microsoft extensions are enabled -// KEYNOMS - This is a keyword that must never be enabled under -// Microsoft mode +// KEYNOMS18 - This is a keyword that must never be enabled under +// MSVC <= v18. // KEYOPENCL - This is a keyword in OpenCL // KEYALTIVEC - This is a keyword in AltiVec // KEYBORLAND - This is a keyword if Borland extensions are enabled @@ -270,7 +270,7 @@ KEYWORD(volatile , KEYALL) KEYWORD(while , KEYALL) KEYWORD(_Alignas , KEYALL) KEYWORD(_Alignof , KEYALL) -KEYWORD(_Atomic , KEYALL|KEYNOMS) +KEYWORD(_Atomic , KEYALL|KEYNOMS18) KEYWORD(_Bool , KEYNOCXX) KEYWORD(_Complex , KEYALL) KEYWORD(_Generic , KEYALL) @@ -331,8 +331,8 @@ CXX_KEYWORD_OPERATOR(xor_eq , caretequal) // C++11 keywords KEYWORD(alignas , KEYCXX11) KEYWORD(alignof , KEYCXX11) -KEYWORD(char16_t , KEYCXX11|KEYNOMS) -KEYWORD(char32_t , KEYCXX11|KEYNOMS) +KEYWORD(char16_t , KEYCXX11|KEYNOMS18) +KEYWORD(char32_t , KEYCXX11|KEYNOMS18) KEYWORD(constexpr , KEYCXX11) KEYWORD(decltype , KEYCXX11) KEYWORD(noexcept , KEYCXX11) diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 613b43fce95..db148f493f4 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -105,10 +105,10 @@ namespace { KEYOPENCL = 0x200, KEYC11 = 0x400, KEYARC = 0x800, - KEYNOMS = 0x01000, + KEYNOMS18 = 0x01000, WCHARSUPPORT = 0x02000, HALFSUPPORT = 0x04000, - KEYALL = (0xffff & ~KEYNOMS) // Because KEYNOMS is used to exclude. + KEYALL = (0xffff & ~KEYNOMS18) // Because KEYNOMS18 is used to exclude. }; /// \brief How a keyword is treated in the selected standard. @@ -154,7 +154,8 @@ static void AddKeyword(StringRef Keyword, KeywordStatus AddResult = getKeywordStatus(LangOpts, Flags); // Don't add this keyword under MSVCCompat. - if (LangOpts.MSVCCompat && (Flags & KEYNOMS)) + if (LangOpts.MSVCCompat && (Flags & KEYNOMS18) && + !LangOpts.isCompatibleWithMSVC(19)) return; // Don't add this keyword if disabled in this language. if (AddResult == KS_Disabled) return; diff --git a/clang/test/SemaCXX/MicrosoftCompatibility.cpp b/clang/test/SemaCXX/MicrosoftCompatibility.cpp index 56486b8f049..480c7cbdcac 100644 --- a/clang/test/SemaCXX/MicrosoftCompatibility.cpp +++ b/clang/test/SemaCXX/MicrosoftCompatibility.cpp @@ -1,9 +1,15 @@ -// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -Wmicrosoft -verify -fms-compatibility -fexceptions -fcxx-exceptions - - +// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -Wmicrosoft -verify -fms-compatibility -fexceptions -fcxx-exceptions -fms-compatibility-version=19.00 +// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -Wmicrosoft -verify -fms-compatibility -fexceptions -fcxx-exceptions -fms-compatibility-version=18.00 + +#if _MSC_VER >= 1900 +char16_t x; +char32_t y; +_Atomic(int) z; +#else typedef unsigned short char16_t; typedef unsigned int char32_t; struct _Atomic {}; +#endif typename decltype(3) a; // expected-warning {{expected a qualified name after 'typename'}} |

