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...

llvm-svn: 40930
This commit is contained in:
Steve Naroff 2007-08-08 17:48:34 +00:00
parent 5ebb2fed89
commit 4bc57c0de7
2 changed files with 14 additions and 3 deletions

View 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.
}
}
@ -120,6 +127,9 @@ 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] == '.');
}

View 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