Implement support for the 'wchar_t' C++ type.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54585 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index f47855a..fef85b5 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -161,7 +161,10 @@
   InitBuiltinType(FloatTy,             BuiltinType::Float);
   InitBuiltinType(DoubleTy,            BuiltinType::Double);
   InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
-  
+
+  // C++ 3.9.1p5
+  InitBuiltinType(WCharTy,             BuiltinType::WChar);
+
   // C99 6.2.5p11.
   FloatComplexTy      = getComplexType(FloatTy);
   DoubleComplexTy     = getComplexType(DoubleTy);
@@ -246,6 +249,10 @@
       Width = Target.getCharWidth();
       Align = Target.getCharAlign();
       break;
+    case BuiltinType::WChar:
+      Width = Target.getWCharWidth();
+      Align = Target.getWCharAlign();
+      break;
     case BuiltinType::UShort:
     case BuiltinType::Short:
       Width = Target.getShortWidth();
@@ -996,11 +1003,28 @@
 /// width of characters in wide strings, The value is target dependent and 
 /// needs to agree with the definition in <stddef.h>.
 QualType ASTContext::getWcharType() const {
+  if (LangOpts.CPlusPlus)
+    return WCharTy;
+
   // On Darwin, wchar_t is defined as a "int". 
   // FIXME: should derive from "Target".
   return IntTy; 
 }
 
+/// getSignedWCharType - Return the type of "signed wchar_t".
+/// Used when in C++, as a GCC extension.
+QualType ASTContext::getSignedWCharType() const {
+  // FIXME: derive from "Target" ?
+  return WCharTy;
+}
+
+/// getUnsignedWCharType - Return the type of "unsigned wchar_t".
+/// Used when in C++, as a GCC extension.
+QualType ASTContext::getUnsignedWCharType() const {
+  // FIXME: derive from "Target" ?
+  return UnsignedIntTy;
+}
+
 /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?)
 /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
 QualType ASTContext::getPointerDiffType() const {