forked from OSchip/llvm-project
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:
parent
0d639a28aa
commit
82e1af20cb
|
@ -873,6 +873,21 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) {
|
||||||
return false;
|
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) {
|
void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
|
||||||
assert(emission.Variable && "emission was not valid!");
|
assert(emission.Variable && "emission was not valid!");
|
||||||
|
|
||||||
|
@ -896,7 +911,9 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
|
||||||
if (emission.IsByRef)
|
if (emission.IsByRef)
|
||||||
emitByrefStructureInit(emission);
|
emitByrefStructureInit(emission);
|
||||||
|
|
||||||
if (!Init) return;
|
if (isTrivialInitializer(Init))
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
CharUnits alignment = emission.Alignment;
|
CharUnits alignment = emission.Alignment;
|
||||||
|
|
||||||
|
|
|
@ -133,3 +133,19 @@ template<typename T>
|
||||||
X<T>::X(const X &other) : start(0), end(0) { }
|
X<T>::X(const X &other) : start(0), end(0) { }
|
||||||
|
|
||||||
X<int> get_X(X<int> x) { return x; }
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue