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;
|
||||
}
|
||||
|
||||
/// \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;
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue