diff options
| author | Hans Wennborg <hans@hanshq.net> | 2013-05-03 09:10:16 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2013-05-03 09:10:16 +0000 |
| commit | cadd77c05bfddc3425ed057519ddac4db37e8b94 (patch) | |
| tree | 3cc9efdfd9374089a003898509f02b0d5c24e56c /clang/lib | |
| parent | b531a11701dbe9cc138ad077a625fd035cc4ce92 (diff) | |
| download | bcm5719-llvm-cadd77c05bfddc3425ed057519ddac4db37e8b94.tar.gz bcm5719-llvm-cadd77c05bfddc3425ed057519ddac4db37e8b94.zip | |
Support __wchar_t in -fms-extensions and -fms-compatibility modes.
MSVC provides __wchar_t, either as an alias for the built-in wchar_t
type, or as a separate type depending on language (C vs C++) and flags
(-fno-wchar).
In -fms-extensions, Clang will simply accept __wchar_t as an alias for
whatever type is used for wide character literals. In -fms-compatibility, we
try to mimic MSVC's behavior by always making __wchar_t a builtin type.
This fixes PR15815.
llvm-svn: 181004
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/AST/Type.cpp | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 5e9a87c58a7..f4e53e61058 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -897,12 +897,13 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target) { InitBuiltinType(Int128Ty, BuiltinType::Int128); InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); - if (LangOpts.CPlusPlus && LangOpts.WChar) { // C++ 3.9.1p5 + if ((LangOpts.CPlusPlus && LangOpts.WChar) || LangOpts.MicrosoftMode) { + // C++ 3.9.1p5 or -fms-compatibility. if (TargetInfo::isTypeSigned(Target.getWCharType())) InitBuiltinType(WCharTy, BuiltinType::WChar_S); else // -fshort-wchar makes wchar_t be unsigned. InitBuiltinType(WCharTy, BuiltinType::WChar_U); - } else // C99 (or C++ using -fno-wchar) + } else // C99 (or C++ using -fno-wchar) in non-MicrosoftMode. WCharTy = getFromTargetType(Target.getWCharType()); WIntTy = getFromTargetType(Target.getWIntType()); diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index fa16facb634..a1f0b08494b 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -1521,7 +1521,7 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const { case Double: return "double"; case LongDouble: return "long double"; case WChar_S: - case WChar_U: return "wchar_t"; + case WChar_U: return Policy.MSWChar ? "__wchar_t" : "wchar_t"; case Char16: return "char16_t"; case Char32: return "char32_t"; case NullPtr: return "nullptr_t"; |

