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:
parent
3a32ed913b
commit
e7c31a9a22
|
@ -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.");
|
||||
|
|
|
@ -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() {}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue