Add support for __builtin_classify_type(). This builtin function isn't "public", however
it is used by "tgmath.h" (so we need to support it). It might also come in handy when
developing the overloaded function macros for OpenCU.

Next check-in will make this an integer constant expression...


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40930 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Builtins.cpp b/AST/Builtins.cpp
index 454085b..099b113 100644
--- a/AST/Builtins.cpp
+++ b/AST/Builtins.cpp
@@ -88,7 +88,7 @@
   switch (*Str++) {
   default: assert(0 && "Unknown builtin type letter!");
   case 'v':
-    assert(!Long && !Signed && !Unsigned && "Bad modifiers used with 'f'!");
+    assert(!Long && !Signed && !Unsigned && "Bad modifiers used with 'v'!");
     return Context.VoidTy;
   case 'f':
     assert(!Long && !Signed && !Unsigned && "Bad modifiers used with 'f'!");
@@ -103,7 +103,14 @@
     if (Unsigned)
       return Context.UnsignedShortTy;
     return Context.ShortTy;
-  //case 'i':
+  case 'i':
+    if (Long)
+      return Unsigned ? Context.UnsignedLongTy : Context.LongTy;
+    if (LongLong)
+      return Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
+    if (Unsigned)
+      return Context.UnsignedIntTy;
+    return Context.IntTy; // default is signed.
   }
 }
 
@@ -119,7 +126,10 @@
   
   assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
          "'.' should only occur at end of builtin type list!");
-  
+
+  // handle untyped/variadic arguments "T c99Style();" or "T cppStyle(...);".
+  if (ArgTypes.size() == 0 && TypeStr[0] == '.')
+    return Context.getFunctionTypeNoProto(ResType);
   return Context.getFunctionType(ResType, &ArgTypes[0], ArgTypes.size(),
                                  TypeStr[0] == '.');
 }