Commit 32912286 by Joseph Myers Committed by Joseph Myers

c-common.c (c_common_reswords): Add _Static_assert for C.

	* c-common.c (c_common_reswords): Add _Static_assert for C.
	* c-parser.c (c_token_starts_declaration,
	c_parser_next_token_starts_declaration,
	c_parser_static_assert_declaration_no_semi,
	c_parser_static_assert_declaration): New.
	(c_parser_declaration_or_fndef): Add parameter static_assert_ok.
	Handle static assertions if static_assert_ok.
	(c_parser_external_declaration, c_parser_declaration_or_fndef,
	c_parser_compound_statement_nostart, c_parser_label,
	c_parser_for_statement, c_parser_objc_methodprotolist,
	c_parser_omp_for_loop): All callers of
	c_parser_declaration_or_fndef changed.
	(c_parser_struct_declaration): Handle static assertions.
	(c_parser_compound_statement_nostart): Use
	c_parser_next_token_starts_declaration and
	c_token_starts_declaration to detect start of declarations.
	(c_parser_label, c_parser_for_statement, c_parser_omp_for_loop):
	Likewise.

testsuite:
	* gcc.dg/c1x-static-assert-1.c, gcc.dg/c1x-static-assert-2.c,
	gcc.dg/c1x-static-assert-3.c, gcc.dg/c1x-static-assert-4.c,
	gcc.dg/c1x-static-assert-5.c, gcc.dg/c1x-static-assert-6.c,
	gcc.dg/c90-static-assert-1.c, gcc.dg/c99-static-assert-1.c: New
	tests.

From-SVN: r159459
parent a3ca07e3
2010-05-16 Joseph Myers <joseph@codesourcery.com>
* c-common.c (c_common_reswords): Add _Static_assert for C.
* c-parser.c (c_token_starts_declaration,
c_parser_next_token_starts_declaration,
c_parser_static_assert_declaration_no_semi,
c_parser_static_assert_declaration): New.
(c_parser_declaration_or_fndef): Add parameter static_assert_ok.
Handle static assertions if static_assert_ok.
(c_parser_external_declaration, c_parser_declaration_or_fndef,
c_parser_compound_statement_nostart, c_parser_label,
c_parser_for_statement, c_parser_objc_methodprotolist,
c_parser_omp_for_loop): All callers of
c_parser_declaration_or_fndef changed.
(c_parser_struct_declaration): Handle static assertions.
(c_parser_compound_statement_nostart): Use
c_parser_next_token_starts_declaration and
c_token_starts_declaration to detect start of declarations.
(c_parser_label, c_parser_for_statement, c_parser_omp_for_loop):
Likewise.
2010-05-16 Anatoly Sokolov <aesok@post.ru>
* config/mmix/mmix.h (FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE,
......
......@@ -563,6 +563,7 @@ const struct c_common_resword c_common_reswords[] =
{ "_Fract", RID_FRACT, D_CONLY | D_EXT },
{ "_Accum", RID_ACCUM, D_CONLY | D_EXT },
{ "_Sat", RID_SAT, D_CONLY | D_EXT },
{ "_Static_assert", RID_STATIC_ASSERT, D_CONLY },
{ "__FUNCTION__", RID_FUNCTION_NAME, 0 },
{ "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
{ "__alignof", RID_ALIGNOF, 0 },
......
2010-05-16 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/c1x-static-assert-1.c, gcc.dg/c1x-static-assert-2.c,
gcc.dg/c1x-static-assert-3.c, gcc.dg/c1x-static-assert-4.c,
gcc.dg/c1x-static-assert-5.c, gcc.dg/c1x-static-assert-6.c,
gcc.dg/c90-static-assert-1.c, gcc.dg/c99-static-assert-1.c: New
tests.
2010-05-15 Jason Merrill <jason@redhat.com>
* g++.dg/eh/spec10.C: New.
......
/* Test C1X static assertions. Valid assertions. */
/* { dg-do compile } */
/* { dg-options "-std=c1x -pedantic-errors" } */
_Static_assert (1, "foo");
enum e { E0, E1 };
_Static_assert (E1, L"bar");
_Static_assert (-1, "foo" L"bar");
struct s
{
int a;
_Static_assert (3, "s");
int b;
};
union u
{
int i;
_Static_assert ((int)1.0, L"");
};
void
f (void)
{
int i;
i = 1;
_Static_assert (0 + 1, "f");
i = 2;
}
void
g (void)
{
int i = 0;
for (_Static_assert (1, ""); i < 10; i++)
;
}
/* Test C1X static assertions. Failed assertions. */
/* { dg-do compile } */
/* { dg-options "-std=c1x -pedantic-errors" } */
_Static_assert (0, "assert1"); /* { dg-error "static assertion failed: \"assert1\"" } */
enum e { E0, E1 };
_Static_assert (E0, L"assert2"); /* { dg-error "static assertion failed: \"assert2\"" } */
_Static_assert (-0, "ass" L"ert3"); /* { dg-error "static assertion failed: \"assert3\"" } */
struct s
{
int a;
_Static_assert (0, "assert4"); /* { dg-error "static assertion failed: \"assert4\"" } */
int b;
};
union u
{
int i;
_Static_assert ((int)0.0, L"assert5"); /* { dg-error "static assertion failed: \"assert5\"" } */
};
void
f (void)
{
int i;
i = 1;
_Static_assert (0 + 0, "assert6"); /* { dg-error "static assertion failed: \"assert6\"" } */
i = 2;
}
void
g (void)
{
int i = 0;
for (_Static_assert (0, "assert7"); i < 10; i++) /* { dg-error "static assertion failed: \"assert7\"" } */
;
}
/* Test C1X static assertions. Invalid assertions. */
/* { dg-do compile } */
/* { dg-options "-std=c1x -pedantic-errors" } */
_Static_assert (__INT_MAX__ * 2, "overflow"); /* { dg-warning "integer overflow in expression" } */
/* { dg-error "overflow in constant expression" "error" { target *-*-* } 5 } */
_Static_assert ((void *)(__SIZE_TYPE__)16, "non-integer"); /* { dg-error "not an integer" } */
_Static_assert (1.0, "non-integer"); /* { dg-error "not an integer" } */
_Static_assert ((int)(1.0 + 1.0), "non-constant-expression"); /* { dg-error "not an integer constant expression" } */
int i;
_Static_assert (i, "non-constant"); /* { dg-error "not constant" } */
void
f (void)
{
int j = 0;
for (_Static_assert (sizeof (struct s { int k; }), ""); j < 10; j++) /* { dg-error "loop initial declaration" } */
;
}
_Static_assert (1, 1); /* { dg-error "expected" } */
_Static_assert (1, ("")); /* { dg-error "expected" } */
/* Test C1X static assertions. More invalid assertions. */
/* { dg-do compile } */
/* { dg-options "-std=c1x -pedantic-errors" } */
/* Static assertions not valid in old-style parameter declarations
because declarations there must have declarators. */
void
f (i)
int i;
_Static_assert (1, ""); /* { dg-error "expected" } */
{
}
/* Test C1X static assertions. Non-constant-expression without -pedantic. */
/* { dg-do compile } */
/* { dg-options "-std=c1x" } */
_Static_assert ((int)(1.0 + 1.0), "non-constant-expression");
/* Test C1X static assertions. Non-constant-expression with -pedantic. */
/* { dg-do compile } */
/* { dg-options "-std=c1x -pedantic" } */
_Static_assert ((int)(1.0 + 1.0), "non-constant-expression"); /* { dg-warning "not an integer constant expression" } */
/* Test for static assertions not in C90. */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
_Static_assert (1, ""); /* { dg-error "ISO C90 does not support '_Static_assert'" } */
/* Test for static assertions not in C99. */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
_Static_assert (1, ""); /* { dg-error "ISO C99 does not support '_Static_assert'" } */
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