From: Daniel Dunbar Date: Tue, 10 Feb 2009 00:06:49 +0000 (+0000) Subject: Make sure to initialize local variables, even if they were ignored by X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b979d9e4c41fb67eb276996bdaa608fb4b11ccd;p=clang Make sure to initialize local variables, even if they were ignored by ABI. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64187 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index fbc421cb9e..f90d31cd0b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1266,6 +1266,13 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI, } case ABIArgInfo::Ignore: + // Initialize the local variable appropriately. + if (hasAggregateLLVMType(Ty)) { + EmitParmDecl(*Arg, CreateTempAlloca(ConvertType(Ty))); + } else { + EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType()))); + } + // Skip increment, no matching LLVM parameter. continue; diff --git a/test/CodeGen/parameter-passing.c b/test/CodeGen/parameter-passing.c index 637a2de42c..5cc5e4797c 100644 --- a/test/CodeGen/parameter-passing.c +++ b/test/CodeGen/parameter-passing.c @@ -1,6 +1,9 @@ // Check the various ways in which the three classes of values // (scalar, complex, aggregate) interact with parameter passing // (function entry, function return, call argument, call result). +// +// We also check _Bool and empty structures, as these can have annoying +// corner cases. // RUN: clang %s -triple i386-unknown-unknown -O3 -emit-llvm -o %t && // RUN: not grep '@g0' %t && @@ -13,18 +16,26 @@ // RUN: not grep '@g0' %t && // RUN: true +typedef _Bool BoolTy; typedef int ScalarTy; typedef _Complex int ComplexTy; typedef struct { int a, b, c; } AggrTy; +typedef struct { int a[0]; } EmptyTy; static int result; +static BoolTy bool_id(BoolTy a) { return a; } static AggrTy aggr_id(AggrTy a) { return a; } +static EmptyTy empty_id(EmptyTy a) { return a; } static ScalarTy scalar_id(ScalarTy a) { return a; } static ComplexTy complex_id(ComplexTy a) { return a; } +static void bool_mul(BoolTy a) { result *= a; } + static void aggr_mul(AggrTy a) { result *= a.a * a.b * a.c; } +static void empty_mul(EmptyTy a) { result *= 53; } + static void scalar_mul(ScalarTy a) { result *= a; } static void complex_mul(ComplexTy a) { result *= __real a * __imag a; } @@ -34,12 +45,14 @@ extern void g0(void); void f0(void) { result = 1; + bool_mul(bool_id(1)); aggr_mul(aggr_id((AggrTy) { 2, 3, 5})); + empty_mul(empty_id((EmptyTy) {})); scalar_mul(scalar_id(7)); complex_mul(complex_id(11 + 13i)); // This call should be eliminated. - if (result != 30030) + if (result != 2 * 3 * 5 * 7 * 11 * 13 * 53) g0(); }