diff --git a/clang/AST/Builtins.cpp b/clang/AST/Builtins.cpp index 454085bf2a52..099b1138d02d 100644 --- a/clang/AST/Builtins.cpp +++ b/clang/AST/Builtins.cpp @@ -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] == '.'); } diff --git a/clang/include/clang/AST/Builtins.def b/clang/include/clang/AST/Builtins.def index 97431da9512f..2a5a8c76a866 100644 --- a/clang/include/clang/AST/Builtins.def +++ b/clang/include/clang/AST/Builtins.def @@ -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