diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 17 | ||||
| -rw-r--r-- | clang/test/CodeGen/varargs.c | 11 | 
2 files changed, 20 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index e658cad5f2a..59e8e77756c 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -268,16 +268,15 @@ llvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,  ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,                                                  ASTContext &Context,                                            llvm::LLVMContext &VMContext) const { -  if (CodeGenFunction::hasAggregateLLVMType(Ty)) { +  if (CodeGenFunction::hasAggregateLLVMType(Ty))      return ABIArgInfo::getIndirect(0); -  } else { -    // Treat an enum type as its underlying type. -    if (const EnumType *EnumTy = Ty->getAs<EnumType>()) -      Ty = EnumTy->getDecl()->getIntegerType(); +   +  // Treat an enum type as its underlying type. +  if (const EnumType *EnumTy = Ty->getAs<EnumType>()) +    Ty = EnumTy->getDecl()->getIntegerType(); -    return (Ty->isPromotableIntegerType() ? -            ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); -  } +  return (Ty->isPromotableIntegerType() ? +          ABIArgInfo::getExtend() : ABIArgInfo::getDirect());  }  /// X86_32ABIInfo - The X86-32 ABI information. @@ -1367,6 +1366,8 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,    //   i8* reg_save_area;    // };    unsigned neededInt, neededSSE; +   +  Ty = CGF.getContext().getCanonicalType(Ty);    ABIArgInfo AI = classifyArgumentType(Ty, CGF.getContext(), VMContext,                                         neededInt, neededSSE); diff --git a/clang/test/CodeGen/varargs.c b/clang/test/CodeGen/varargs.c new file mode 100644 index 00000000000..b3dba240b55 --- /dev/null +++ b/clang/test/CodeGen/varargs.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s + + +// PR6433 - Don't crash on va_arg(typedef). +typedef double gdouble; +void focus_changed_cb () { +    __builtin_va_list pa; +    double mfloat; +    mfloat = __builtin_va_arg((pa), gdouble); +} +  | 

