[Sema] Fix a pair of crashes when generating exception specifiers with an

error'ed field for a template class' default ctor.

The two examples in the test would both cause a compiler assert when attempting
to calculate the exception specifier for the default constructor for the
template classes. The problem was that dependents of this function expect that
Field->getInClassInitializer (including canThrow) is not nullptr. However, if
the template's initializer has an error, exactly that situation happens.

This patch simply sets the field to be invalid.

Differential Revision: https://reviews.llvm.org/D37865

llvm-svn: 313569
This commit is contained in:
Erich Keane 2017-09-18 21:28:55 +00:00
parent 283eae82fd
commit 0ac9524c99
2 changed files with 33 additions and 1 deletions

View File

@ -12436,7 +12436,8 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
assert(Pattern && "We must have set the Pattern!"); assert(Pattern && "We must have set the Pattern!");
} }
if (InstantiateInClassInitializer(Loc, Field, Pattern, if (!Pattern->hasInClassInitializer() ||
InstantiateInClassInitializer(Loc, Field, Pattern,
getTemplateInstantiationArgs(Field))) { getTemplateInstantiationArgs(Field))) {
// Don't diagnose this again. // Don't diagnose this again.
Field->setInvalidDecl(); Field->setInvalidDecl();

View File

@ -0,0 +1,31 @@
// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
// Test reproduces a pair of crashes that were caused by code attempting
// to materialize a default constructor's exception specifier.
template <class T> struct A {
static T tab[];
const int M = UNDEFINED; // expected-error {{use of undeclared identifier}}
int main()
{
A<char> a;
return 0;
}
};
template <class T> struct B {
static T tab[];
// expected-error@+1 {{invalid application of 'sizeof' to an incomplete type}}
const int N = sizeof(B<char>::tab) / sizeof(char);
int main()
{
B<char> b;
return 0;
}
};