Commit d6a1dfd9 by Joseph Myers

c-tree.h (enum c_storage_class): New.

	* c-tree.h (enum c_storage_class): New.
	(struct c_declspecs): Add storage_class, inline_p and thread_p.
	* c-decl.c (shadow_tag_warned): Give errors for "inline" in empty
	declarations and "auto" or "register" in file scope empty
	declarations.  Give more specific warnings for other cases of
	storage class specifiers in empty declarations.
	(grokdeclarator): Update for new structures.  Don't check for
	multiple storage classes.  Diagnose file-scope "register" if
	pedantic.
	(build_null_declspecs): Update.
	(declspecs_add_scspec): Update.  Diagnose multiple storage class
	specifiers and invalid uses of "__thread".

testsuite:
	* gcc.dg/declspec-4.c, gcc.dg/declspec-5.c, gcc.dg/declspec-6.c,
	gcc.dg/tls/diag-2.c: Update expected messages.
	* gcc.dg/991209-1.c: Specify compilation options.  Update expected
	messages.
	* gcc.dg/pr14289-2.c, gcc.dg/pr14289-3.c: Remove.
	* gcc.dg/declspec-7.c, gcc.dg/declspec-8.c, gcc.dg/declspec-9.c,
	gcc.dg/declspec-10.c, gcc.dg/declspec-11.c, gcc.dg/tls/diag-4.c,
	gcc.dg/tls/diag-5.c: New tests.

From-SVN: r87376
parent ca472546
...@@ -131,6 +131,16 @@ struct c_expr ...@@ -131,6 +131,16 @@ struct c_expr
enum tree_code original_code; enum tree_code original_code;
}; };
/* A storage class specifier. */
enum c_storage_class {
csc_none,
csc_auto,
csc_extern,
csc_register,
csc_static,
csc_typedef
};
/* A sequence of declaration specifiers in C. */ /* A sequence of declaration specifiers in C. */
struct c_declspecs { struct c_declspecs {
/* The type specified, not reflecting modifiers such as "short" and /* The type specified, not reflecting modifiers such as "short" and
...@@ -144,6 +154,8 @@ struct c_declspecs { ...@@ -144,6 +154,8 @@ struct c_declspecs {
tree attrs; tree attrs;
/* The modifier bits present. */ /* The modifier bits present. */
int specbits; int specbits;
/* The storage class specifier, or csc_none if none. */
enum c_storage_class storage_class;
/* Whether something other than a storage class specifier or /* Whether something other than a storage class specifier or
attribute has been seen. This is used to warn for the attribute has been seen. This is used to warn for the
obsolescent usage of storage class specifiers other than at the obsolescent usage of storage class specifiers other than at the
...@@ -164,6 +176,10 @@ struct c_declspecs { ...@@ -164,6 +176,10 @@ struct c_declspecs {
BOOL_BITFIELD explicit_char_p : 1; BOOL_BITFIELD explicit_char_p : 1;
/* Whether "long" was specified more than once. */ /* Whether "long" was specified more than once. */
BOOL_BITFIELD long_long_p : 1; BOOL_BITFIELD long_long_p : 1;
/* Whether "inline" was specified. */
BOOL_BITFIELD inline_p : 1;
/* Whether "__thread" was specified. */
BOOL_BITFIELD thread_p : 1;
}; };
/* The various kinds of declarators in C. */ /* The various kinds of declarators in C. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment