Don't zero-initialize default-initialized local variables that have

trivial default constructors. This generated-code regression was
caused by r131796, which had simplified the handling of default
initialization in Sema. Fixes <rdar://problem/9694300>.

llvm-svn: 134260
This commit is contained in:
Douglas Gregor 2011-07-01 21:08:19 +00:00
parent 0d639a28aa
commit 82e1af20cb
2 changed files with 34 additions and 1 deletions

View File

@ -873,6 +873,21 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) {
return false;
}
/// \brief Determine whether the given initializer is trivial in the sense
/// that it requires no code to be generated.
static bool isTrivialInitializer(const Expr *Init) {
if (!Init)
return true;
if (const CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init))
if (CXXConstructorDecl *Constructor = Construct->getConstructor())
if (Constructor->isTrivial() &&
Constructor->isDefaultConstructor() &&
!Construct->requiresZeroInitialization())
return true;
return false;
}
void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
assert(emission.Variable && "emission was not valid!");
@ -896,7 +911,9 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
if (emission.IsByRef)
emitByrefStructureInit(emission);
if (!Init) return;
if (isTrivialInitializer(Init))
return;
CharUnits alignment = emission.Alignment;

View File

@ -133,3 +133,19 @@ template<typename T>
X<T>::X(const X &other) : start(0), end(0) { }
X<int> get_X(X<int> x) { return x; }
namespace rdar9694300 {
struct X {
int x;
};
// CHECK: define void @_ZN11rdar96943001fEv
void f() {
// CHECK: alloca
X x;
// CHECK-NEXT: [[I:%.*]] = alloca i32
// CHECK-NEXT: store i32 17, i32* [[I]]
int i = 17;
// CHECK-NEXT: ret void
}
}