Part three of PR15721: if we have an invalid CXXDefaultInitExpr, don't crash if

we try to constant-evaluate it. Patch by Karthik Bhat, test by me.

llvm-svn: 190722
This commit is contained in:
Richard Smith 2013-09-13 20:51:45 +00:00
parent 8c9795d9fa
commit 17e32460ed
2 changed files with 24 additions and 2 deletions

View File

@ -3742,8 +3742,12 @@ public:
{ return StmtVisitorTy::Visit(E->getReplacement()); }
RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
{ return StmtVisitorTy::Visit(E->getExpr()); }
RetTy VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E)
{ return StmtVisitorTy::Visit(E->getExpr()); }
RetTy VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E) {
// The initializer may not have been parsed yet, or might be erroneous.
if (!E->getExpr())
return Error(E);
return StmtVisitorTy::Visit(E->getExpr());
}
// We cannot create any objects for which cleanups are required, so there is
// nothing to do here; all cleanups must come from unevaluated subexpressions.
RetTy VisitExprWithCleanups(const ExprWithCleanups *E)

View File

@ -1776,3 +1776,21 @@ namespace ZeroSizeTypes {
return &arr[3] - &arr[0]; // expected-note {{subtraction of pointers to type 'int [0]' of zero size}}
}
}
namespace BadDefaultInit {
template<int N> struct X { static const int n = N; };
struct A { // expected-note {{subexpression}}
int k = X<A().k>::n; // expected-error {{defaulted default constructor of 'A' cannot be used}} expected-error {{not a constant expression}} expected-note {{in call to 'A()'}}
};
// FIXME: The "constexpr constructor must initialize all members" diagnostic
// here is bogus (we discard the k(k) initializer because the parameter 'k'
// has been marked invalid).
struct B { // expected-note 2{{candidate}}
constexpr B( // expected-error {{must initialize all members}} expected-note {{candidate}}
int k = X<B().k>::n) : // expected-error {{no matching constructor}}
k(k) {}
int k; // expected-note {{not initialized}}
};
}