]> granicus.if.org Git - clang/commitdiff
Add support for __builtin_classify_type(). This builtin function isn't "public",...
authorSteve Naroff <snaroff@apple.com>
Wed, 8 Aug 2007 17:48:34 +0000 (17:48 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 8 Aug 2007 17:48:34 +0000 (17:48 +0000)
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

AST/Builtins.cpp
include/clang/AST/Builtins.def

index 454085bf2a52f3faf9dd9ca9e1b4fa094baeb37f..099b1138d02d50eadd4187535cb5d3f7bd61501f 100644 (file)
@@ -88,7 +88,7 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context) {
   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 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context) {
     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 @@ QualType Builtin::Context::GetBuiltinType(unsigned id, ASTContext &Context)const
   
   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] == '.');
 }
index 97431da9512fbaeb8789786cfb59d32f223ffe4a..2a5a8c76a86674a95f07fd0a422e033ba2adba75 100644 (file)
@@ -49,5 +49,6 @@ BUILTIN(__builtin_fabs , "dd"  , "nc")
 BUILTIN(__builtin_fabsf, "ff"  , "nc")
 BUILTIN(__builtin_fabsl, "LdLd", "nc")
 BUILTIN(__builtin_constant_p, "UsUs", "nc")
+BUILTIN(__builtin_classify_type, "i.", "nc")
 
 #undef BUILTIN