diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-11 04:26:55 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-11 04:26:55 +0000 |
commit | 31ddae9f8ec363003363367cafdf8243abbb017e (patch) | |
tree | 17de84c82d5527a115d97db14a145ae19c48be07 /gcc/testsuite | |
parent | 7b26d9f7fdb11e54d7e74de5b8c9b30a7a218cb1 (diff) | |
download | gcc-31ddae9f8ec363003363367cafdf8243abbb017e.tar.gz |
2003-04-10 Zack Weinberg <zack@codesourcery.com>
* c-decl.c (struct binding_level): Add shadowed_tags and
function_body; remove this_block, tag_transparent, and
subblocks_tag_transparent; update comments.
(clear_binding_level, lookup_tag_reverse): Kill.
(make_binding_level): Use ggc_alloc_cleared or memset.
(lookup_tag): Remove struct binding_level* parameter. All
callers changed. Just look at IDENTIFIER_TAG_VALUE, and
current_binding_level->tags if asked for thislevel_only or if
we might have to diagnose "struct foo; union foo;"
(pushlevel): Ignore argument. Do not push another binding
level on the transition from the parameters to the top level
of the function body; just tweak the flags and proceed.
(poplevel): Overhaul. Clear IDENTIFIER_TAG_VALUEs; on exiting
a function body, separate the parameter list from the
top-level local variables.
(set_block): Do nothing.
(pushtag): Set IDENTIFIER_TAG_VALUE and add an entry to
shadowed_tags if necessary.
(warn_if_shadowing): Nuke the special case for local shadowing
parameter.
(pushdecl): Do not create a shadow entry if we are replacing
an older decl in the same binding level.
(pushdecl_function_level): Tweak for new way of indicating
function scope.
(shadow_tag_warned): Use TYPE_NAME, not lookup_tag_reverse.
(start_function): Don't set subblocks_tag_transparent.
(finish_function): Fix up the binding_level stack for totally
empty functions. Otherwise, don't call poplevel.
* c-common.c (shadow_warning): MANDATORY argument is no longer
necessary. Always use plain warning.
* c-common.h: Update to match.
* cfglayout.c (scope_to_insns_initialize): Clear block when we
hit the FUNCTION_DECL.
* function.c: Do not create cyclic tree structure.
2003-04-10 Zack Weinberg <zack@codesourcery.com>
* c-tree.h (struct lang_identifier): Replace global_value,
local_value members with symbol_value, tag_value. Kill
implicit_decl and limbo_value.
(IDENTIFIER_GLOBAL_VALUE, IDENTIFIER_LOCAL_VALUE,
IDENTIFIER_LIMBO_VALUE, IDENTIFIER_IMPLICIT_DECL,
C_MISSING_PROTOTYPE_WARNED): Kill.
(IDENTIFIER_SYMBOL_VALUE, IDENTIFIER_TAG_VALUE,
C_DECL_IMPLICIT, C_DECL_ISNT_PROTOTYPE): New.
(C_DECL_ANTICIPATED): Rename to C_DECL_INVISIBLE.
(implicit_decl_warning, lookup_name_current_level,
record_function_scope_shadow): Don't prototype.
(pushdecl_function_level): Prototype.
* c-decl.c (truly_local_externals): New variable.
(struct binding_level): Adjust commentary.
(get_function_binding_level, clear_limbo_values,
record_function_scope_shadow): Kill.
(lookup_name_current_level, implicit_decl_warning): Are now static.
(any_external_decl, record_external_decl): New static functions.
(clone_underlying type): Split out of pushdecl.
(c_print_identifier): Update to match changes to struct
lang_identifier.
(poplevel): Delete #if 0 block. Make externals invisible
instead of clearing their IDENTIFIER_SYMBOL_VALUEs. Don't
call clear_limbo_values. Refer to IDENTIFIER_SYMBOL_VALUE not
IDENTIFIER_GLOBAL_VALUE or IDENTIFIER_LOCAL_VALUE.
(duplicate-decls): For real parm decl after a forward decl,
set TREE_ASM_WRITTEN here. Allow void foo(...) followed by
foo(...) { } with only a warning. Say whether a previous
declaration was implicit.
(warn_if_shadowing): Now handles all shadowing, not just
local-over-local. Clarify comments.
(pushdecl): Rewritten. There is no longer a distinction
between global and local symbol values; they're all
IDENTIFIER_SYMBOL_VALUE. Call record_external_decl on all
DECL_EXTERNAL decls, and use any_external_decl to check
against previous externals. Kill #if 0 blocks. Don't
tolerate error_mark_node being NULL.
(pushdecl_top_level): Handle only those cases which
Objective C (the only user) needs.
(pushdecl_function_level): New function.
(implicitly_declare): Create ordinary decls with
C_DECL_IMPLICIT set. Recycle old decls, however they got
created.
(lookup_name): It's always IDENTIFIER_SYMBOL_VALUE. Return 0
for C_DECL_INVISIBLE symbols.
(lookup_name_current_level): Likewise. Use chain_member.
(c_make_fname_decl): Don't muck with DECL_CONTEXT.
Use pushdecl_function_level.
(builtin_function): Use C_DECL_INVISIBLE.
(start_function): Don't muck with IDENTIFIER_IMPLICIT_DECL.
Use C_DECL_ISNT_PROTOTYPE and C_DECL_IMPLICIT.
(store_parm_decls): It's IDENTIFIER_SYMBOL_VALUE now.
(identifier_global_value): Same. Must scan
global_binding_level in extremis.
* c-typeck.c (undeclared_variable): New static function, split
from build_external_ref.
(build_external_ref): Use DECL_CONTEXT, not
IDENTIFIER_LOCAL_VALUE, to decide whether a local hides
an instance variable. Restructure for clarity.
* objc/objc-act.c: Use identifier_global_value, not
IDENTIFIER_GLOBAL_VALUE.
cp:
* decl.c: Update all calls to shadow_warning.
testsuite:
* gcc.c-torture/execute/builtin-noret-2.c: New.
* gcc.c-torture/execute/builtin-noret-2.x: New.
XFAIL builtin-noret-2.c at -O1 and above.
* gcc.dg/redecl.c: New.
* gcc.dg/Wshadow-1.c: Update error regexps.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65460 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.c | 84 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.x | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wshadow-1.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/redecl-1.c | 101 |
5 files changed, 207 insertions, 2 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52be21cb002..7b23832937e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2003-04-10 Zack Weinberg <zack@codesourcery.com> + + * gcc.c-torture/execute/builtin-noret-2.c: New. + * gcc.c-torture/execute/builtin-noret-2.x: New. + XFAIL builtin-noret-2.c at -O1 and above. + * gcc.dg/redecl.c: New. + * gcc.dg/Wshadow-1.c: Update error regexps. + 2003-04-10 Mark Mitchell <mark@codesourcery.com> * g++.dg/abi/bitfield10.C: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.c b/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.c new file mode 100644 index 00000000000..077153b1cb9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.c @@ -0,0 +1,84 @@ +/* Test for builtin noreturn attributes when the visible declarations + are function-local. Doesn't presently work. Modified from + builtin-noret-1.c by Zack Weinberg <zack@codesourcery.com>. */ + +extern void tabort (void); +extern void texit (void); +extern void t_exit (void); +extern void t_Exit (void); + +extern void link_failure (void); + +int +main (void) +{ + volatile int i = 0; + /* The real test here is that the program links. */ + if (i) + tabort (); + if (i) + texit (); + if (i) + t_exit (); + if (i) + t_Exit (); + exit (0); +} + +void +tabort (void) +{ + extern void abort (void); + abort (); + link_failure (); +} + +void +texit (void) +{ + extern void exit (int); + exit (1); + link_failure (); +} + +void +t_exit (void) +{ + extern void _exit (int); + _exit (1); + link_failure (); +} + +/* Some non-Unix libcs might not have _exit. This version should never + get called. */ +static void +_exit (int i) +{ + abort (); +} + +void +t_Exit (void) +{ + extern void _Exit (int); + _Exit (1); + link_failure (); +} + +/* Some libcs might not have _Exit. This version should never get called. */ +static void +_Exit (int i) +{ + abort (); +} + +/* When optimizing, no calls to link_failure should remain. In any case, + link_failure should not be called. */ + +#ifndef __OPTIMIZE__ +void +link_failure (void) +{ + abort (); +} +#endif diff --git a/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.x b/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.x new file mode 100644 index 00000000000..7926a94f781 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.x @@ -0,0 +1,12 @@ +# This test fails at -O1 and higher. +set torture_eval_before_compile { + global compiler_conditional_xfail_data + set compiler_conditional_xfail_data { + "Fails at all optimization levels but -O0, see PR10375." \ + { "*-*-*" } \ + { "-O*" } \ + { "-O0" } + } +} + +return 0 diff --git a/gcc/testsuite/gcc.dg/Wshadow-1.c b/gcc/testsuite/gcc.dg/Wshadow-1.c index 320d4f808da..c9c3acb98c9 100644 --- a/gcc/testsuite/gcc.dg/Wshadow-1.c +++ b/gcc/testsuite/gcc.dg/Wshadow-1.c @@ -10,10 +10,10 @@ void foo (double decl1) /* { dg-warning "shadows a global decl" } */ { } -void foo1 (int d) /* { dg-warning "shadowed declaration" } */ +void foo1 (int d) /* { dg-warning "previous declaration" } */ { double d; /* { dg-bogus "warning" "warning in place of error" } */ - /* { dg-error "shadows a parameter" "" { target *-*-* } 15 } */ + /* { dg-error "redeclared as different" "" { target *-*-* } 15 } */ } void foo2 (int d) /* { dg-warning "shadowed declaration" } */ diff --git a/gcc/testsuite/gcc.dg/redecl-1.c b/gcc/testsuite/gcc.dg/redecl-1.c new file mode 100644 index 00000000000..d2355ba7aa2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/redecl-1.c @@ -0,0 +1,101 @@ +/* Test for various situations where a new declaration of an + identifier conflicts with an earlier declaration which isn't in the + same scope. These are all undefined behavior per C89 sections + 6.1.2.2p7, 6.1.2.6p2, and 6.3.2.2p2/footnote 38 (C99 6.2.2p7 and + 6.2.7p2 - implicit declarations are invalid in C99). */ + +/* { dg-do compile } */ +/* { dg-options "-std=c89 -pedantic -Wall -Wno-unused" } */ + +/* Extern at function scope, clashing with extern at file scope */ + +extern int foo1; /* { dg-error "previous" } */ +extern int bar1(int); /* { dg-error "previous" } */ + +void test1(void) +{ + extern double foo1; /* { dg-error "conflict" } */ + extern double bar1(double); /* { dg-error "conflict" } */ +} + +/* Extern at file scope, clashing with extern at function scope */ + +void test2(void) +{ + extern double foo2; /* { dg-error "previous" } */ + extern double bar2(double); /* { dg-error "previous" } */ +} + +extern int foo2; /* { dg-error "conflict" } */ +extern int bar2(int); /* { dg-error "conflict" } */ + +/* Extern at function scope, clashing with extern at earlier function + scope. Also, don't be fooled by a typedef at file scope. */ + +typedef float baz3; /* { dg-bogus } */ + +void prime3(void) +{ + extern int foo3; /* { dg-error "previous" } */ + extern int bar3(int); /* { dg-error "previous" } */ + extern int baz3; /* { dg-error "previous" } */ +} + +void test3(void) +{ + extern double foo3; /* { dg-error "conflict" } */ + extern double bar3(double); /* { dg-error "conflict" } */ + extern double baz3; /* { dg-error "conflict" } */ +} + +/* Extern at function scope, clashing with previous implicit decl. */ + +void prime4(void) +{ + bar4(); /* { dg-error "previous|implicit" } */ +} + +void test4(void) +{ + extern double bar4(double); /* { dg-error "conflict" } */ +} + +/* Implicit decl, clashing with extern at previous function scope. */ + +void prime5(void) +{ + extern double bar5(double); /* { dg-error "previous" "" { xfail *-*-* } } */ +} + +void test5(void) +{ + bar5(1); /* { dg-error "implicit" } */ +} + +/* Extern then static, both at file scope. */ + +extern int test6(int); /* { dg-warning "previous" "" { xfail *-*-* } } */ +static int test6(int x) +{ return x; } /* { dg-warning "follows non-static" } */ + + +/* Extern then static, extern at previous function scope. */ + +void prime7(void) +{ + extern int test7(int); /* { dg-warning "previous" "" { xfail *-*-* } } */ +} + +static int test7(int x) +{ return x; } /* { dg-warning "follows non-static" } */ + +/* Implicit decl then static. */ + +void prime8(void) +{ + test8(); /* { dg-warning "previous" "" { xfail *-*-* } } */ + /* { dg-warning "implicit" "" { target *-*-* } 96 } */ +} + +static int test8(int x) +{ return x; } /* { dg-warning "follows non-static" } */ |