mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:46:39 +00:00

When we synthesize an implicit inner initializer list when analyzing an outer initializer list, we add it to the outer list immediately, and then fill in the inner list. This gives the outer list no chance to update its *-dependence bits with those of the completed inner list. To fix this, re-add the inner list to the outer list once it's completed. Note that we do not recompute the *-dependence bits from scratch when we complete an outer list; this would give the wrong result for the case where a designated initializer overwrites a dependent initializer with a non-dependent one. The resulting list in that case should still be dependent, even though all traces of the dependence were removed from the semantic form. llvm-svn: 324537
40 lines
827 B
C++
40 lines
827 B
C++
// 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;
|
|
}
|
|
};
|
|
|
|
// This test checks for a crash that resulted from us miscomputing the
|
|
// dependence of a nested initializer list.
|
|
template<int> struct X {
|
|
static constexpr int n = 4;
|
|
static constexpr int a[1][1] = {n};
|
|
};
|
|
|