forked from OSchip/llvm-project
[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:
parent
283eae82fd
commit
0ac9524c99
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue