Throw away stray CXXDefaultArgExprs. Fixes PR12061.

I think there's a deeper problem here in the way TransformCXXConstructExpr works, but I won't tackle it now.

llvm-svn: 151146
This commit is contained in:
Sebastian Redl 2012-02-22 09:07:21 +00:00
parent 3a32ed913b
commit e7c31a9a22
2 changed files with 47 additions and 0 deletions

View File

@ -1018,6 +1018,13 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
} else if (Initializer && isa<InitListExpr>(Initializer))
initStyle = CXXNewExpr::ListInit;
else {
// In template instantiation, the initializer could be a CXXDefaultArgExpr
// unwrapped from a CXXConstructExpr that was implicitly built. There is no
// particularly sane way we can handle this (especially since it can even
// occur for array new), so we throw the initializer away and have it be
// rebuilt.
if (Initializer && isa<CXXDefaultArgExpr>(Initializer))
Initializer = 0;
assert((!Initializer || isa<ImplicitValueInitExpr>(Initializer) ||
isa<CXXConstructExpr>(Initializer)) &&
"Initializer expression that cannot have been implicitly created.");

View File

@ -460,3 +460,43 @@ namespace P12023 {
return 0;
}
}
namespace PR12061 {
template <class C> struct scoped_array {
scoped_array(C* p = __null);
};
template <class Payload> struct Foo {
Foo() : a_(new scoped_array<int>[5]) { }
scoped_array< scoped_array<int> > a_;
};
class Bar {};
Foo<Bar> x;
template <class C> struct scoped_array2 {
scoped_array2(C* p = __null, C* q = __null);
};
template <class Payload> struct Foo2 {
Foo2() : a_(new scoped_array2<int>[5]) { }
scoped_array2< scoped_array2<int> > a_;
};
class Bar2 {};
Foo2<Bar2> x2;
class MessageLoop {
public:
explicit MessageLoop(int type = 0);
};
template <class CookieStoreTestTraits>
class CookieStoreTest {
protected:
CookieStoreTest() {
new MessageLoop;
}
};
struct CookieMonsterTestTraits {
};
class DeferredCookieTaskTest : public CookieStoreTest<CookieMonsterTestTraits>
{
DeferredCookieTaskTest() {}
};
}