Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
clang/test/Sema/incomplete-decl.c
// RUN: %clang_cc1 -fsyntax-only -verify %s | // RUN: %clang_cc1 -fsyntax-only -verify=c,expected %s | ||||
// RUN: %clang_cc1 -x c++ -fsyntax-only -verify=cxx,expected %s | |||||
struct foo; // expected-note 5 {{forward declaration of 'struct foo'}} | |||||
aaron.ballman: We typically try to keep `#if` conditions like this out of test code because it makes it too… | |||||
struct foo; // c-note 5 {{forward declaration of 'struct foo'}} \ | |||||
cxx-note 3 {{forward declaration of 'foo'}} | |||||
void b; // expected-error {{variable has incomplete type 'void'}} | void b; // expected-error {{variable has incomplete type 'void'}} | ||||
Not Done ReplyInline Actionscxx-note 3 {{forward declaration of 'foo'}} instead of duplicating the same diagnostic across multiple lines? Also, to help make it easier to read, can you indent the second line so that cxx-note aligns with c-note from the line above? (Same suggestion throughout the file.) aaron.ballman: `cxx-note 3 {{forward declaration of 'foo'}}` instead of duplicating the same diagnostic across… | |||||
struct foo f; // expected-error{{tentative definition has type 'struct foo' that is never completed}} | struct foo f; // c-error {{tentative definition has type 'struct foo' that is never completed}} \ | ||||
cxx-error {{variable has incomplete type 'struct foo'}} | |||||
static void c; // expected-error {{variable has incomplete type 'void'}} | 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'}} \ | static struct foo g; // c-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}} | c-error {{tentative definition has type 'struct foo' that is never completed}} \ | ||||
cxx-error {{variable has incomplete type 'struct foo'}} | |||||
extern void d; | extern void d; // cxx-error {{variable has incomplete type 'void'}} | ||||
extern struct foo e; | extern struct foo e; | ||||
int ary[]; // expected-warning {{tentative array definition assumed to have one element}} | int ary[]; // c-warning {{tentative array definition assumed to have one element}} \ | ||||
struct foo bary[]; // expected-error {{array has incomplete element type 'struct foo'}} | cxx-error {{definition of variable with array type needs an explicit size or an initializer}} | ||||
struct foo bary[]; // c-error {{array has incomplete element type 'struct foo'}} \ | |||||
cxx-error {{definition of variable with array type needs an explicit size or an initializer}} | |||||
void func(void) { | void func(void) { | ||||
int ary[]; // expected-error{{definition of variable with array type needs an explicit size or an initializer}} | 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'}} | void b; // expected-error {{variable has incomplete type 'void'}} | ||||
struct foo f; // expected-error {{variable has incomplete type 'struct foo'}} | struct foo f; // expected-error {{variable has incomplete type 'struct foo'}} | ||||
} | } | ||||
int h[]; // expected-warning {{tentative array definition assumed to have one element}} | int h[]; // c-warning {{tentative array definition assumed to have one element}} \ | ||||
int (*i)[] = &h+1; // expected-error {{arithmetic on a pointer to an incomplete type 'int[]'}} | cxx-error {{definition of variable with array type needs an explicit size or an initializer}} | ||||
int (*i)[] = &h+1; // c-error {{arithmetic on a pointer to an incomplete type 'int[]'}} | |||||
struct bar j = {1}; // expected-error {{variable has incomplete type 'struct bar'}} \ | struct bar j = {1}; // expected-error {{variable has incomplete type 'struct bar'}} \ | ||||
expected-note {{forward declaration of 'struct bar'}} | c-note {{forward declaration of 'struct bar'}} \ | ||||
struct bar k; | cxx-note 2 {{forward declaration of 'bar'}} | ||||
struct bar k; // cxx-error {{variable has incomplete type 'struct bar'}} | |||||
struct bar { int a; }; | struct bar { int a; }; | ||||
struct x y; //c-note 2 {{forward declaration of 'struct x'}} \ | |||||
cxx-error {{variable has incomplete type 'struct x'}} \ | |||||
cxx-note {{forward declaration of 'x'}} | |||||
void foo() { | |||||
(void)(1 ? y : y); // c-error 2 {{incomplete type 'struct x' where a complete type is required}} | |||||
} | |||||
struct x{ | |||||
int a; | |||||
}; |
We typically try to keep #if conditions like this out of test code because it makes it too easy to not know what part of the test is actually being tested. There's a different approach that I think will work better here: use -verify=cxx on the C++ RUN line.
-verify turns on the diagnostic verifier, which looks for those expected-whatever comments. When you use -verify=foo, the diagnostic verifier looks for foo-whatever instead of expected-whatever. So if you use -verify=cxx, you can specify the C++-specific diagnostics with cxx-error {{words}} and the C-specific ones with expected-error {{different words}} which lets you get rid of the #if.