summaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-11 04:26:55 +0000
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-11 04:26:55 +0000
commit31ddae9f8ec363003363367cafdf8243abbb017e (patch)
tree17de84c82d5527a115d97db14a145ae19c48be07 /gcc/testsuite
parent7b26d9f7fdb11e54d7e74de5b8c9b30a7a218cb1 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.c84
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/builtin-noret-2.x12
-rw-r--r--gcc/testsuite/gcc.dg/Wshadow-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/redecl-1.c101
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" } */