mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-26 14:58:59 -04:00

Sema::ActOnUninitializedDecl over to InitializationSequence (with default initialization), eliminating redundancy. More importantly, we now check that a const definition in C++ has an initilizer, which was an #if 0'd code for many, many months. A few other tweaks were needed to get everything working again: - Fix all of the places in the testsuite where we defined const objects without initializers (now that we diagnose this issue) - Teach instantiation of static data members to find the previous declaration, so that we build proper redeclaration chains. Previously, we had the redeclaration chain but built it too late to be useful, because... - Teach instantiation of static data member definitions not to try to check an initializer if a previous declaration already had an initializer. This makes sure that we don't complain about static const data members with in-class initializers and out-of-line definitions. - Move all of the incomplete-type checking logic out of Sema::FinalizeDeclaratorGroup; it makes more sense in ActOnUnitializedDecl. There may still be a few places where we can improve these diagnostics. I'll address that as a separate commit. llvm-svn: 95657
32 lines
1.4 KiB
C
32 lines
1.4 KiB
C
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
struct foo; // expected-note 5 {{forward declaration of 'struct foo'}}
|
|
|
|
void b; // expected-error {{variable has incomplete type 'void'}}
|
|
struct foo f; // expected-error{{tentative definition has type 'struct foo' that is never completed}}
|
|
|
|
static void c; // expected-error {{variable has incomplete type 'void'}}
|
|
static struct foo g; // expected-warning {{tentative definition of variable with internal linkage has incomplete non-array type 'struct foo'}} \
|
|
expected-error{{tentative definition has type 'struct foo' that is never completed}}
|
|
|
|
extern void d;
|
|
extern struct foo e;
|
|
|
|
int ary[]; // expected-warning {{tentative array definition assumed to have one element}}
|
|
struct foo bary[]; // expected-error {{array has incomplete element type 'struct foo'}}
|
|
|
|
void func() {
|
|
int ary[]; // expected-error{{definition of variable with array type needs an explicit size or an initializer}}
|
|
void b; // expected-error {{variable has incomplete type 'void'}}
|
|
struct foo f; // expected-error {{variable has incomplete type 'struct foo'}}
|
|
}
|
|
|
|
int h[]; // expected-warning {{tentative array definition assumed to have one element}}
|
|
int (*i)[] = &h+1; // expected-error {{arithmetic on pointer to incomplete type 'int (*)[]'}}
|
|
|
|
struct bar j = {1}; // expected-error {{variable has incomplete type 'struct bar'}} \
|
|
expected-note {{forward declaration of 'struct bar'}}
|
|
struct bar k;
|
|
struct bar { int a; };
|
|
|