diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-11 07:33:31 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-11 07:33:31 +0000 |
| commit | 646a1d63d9cd9a3827b40a0fad6959127def8c46 (patch) | |
| tree | e1b874c70f6faf84aed3125f9e65ab492e614198 /gcc | |
| parent | 5100ec9c10989dfa81f8ce479a5d56816339443b (diff) | |
| download | ppe42-gcc-646a1d63d9cd9a3827b40a0fad6959127def8c46.tar.gz ppe42-gcc-646a1d63d9cd9a3827b40a0fad6959127def8c46.zip | |
PR c/21502
* c-decl.c (finish_decl): Propagate the completed array type of
a global variable into the binding.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99563 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/c-decl.c | 38 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/redecl-16.c | 18 |
3 files changed, 56 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cfdcdc881eb..f9e5d1498a2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-05-11 Richard Henderson <rth@redhat.com> + + PR c/21502 + * c-decl.c (finish_decl): Propagate the completed array type of + a global variable into the binding. + 2005-05-10 Matt Kraai <kraai@ftbfs.org> * Makefile.in (gtype-desc.o, build/genautomata.o) diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 0ca4500021e..6c9ab457510 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3275,11 +3275,13 @@ finish_decl (tree decl, tree init, tree asmspec_tree) /* Get the completed type made by complete_array_type. */ type = TREE_TYPE (decl); - if (failure == 1) - error ("%Jinitializer fails to determine size of %qD", decl, decl); - - else if (failure == 2) + switch (failure) { + case 1: + error ("%Jinitializer fails to determine size of %qD", decl, decl); + break; + + case 2: if (do_default) error ("%Jarray size missing in %qD", decl, decl); /* If a `static' var's size isn't known, @@ -3290,9 +3292,33 @@ finish_decl (tree decl, tree init, tree asmspec_tree) and it will get allocated. */ else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl)) DECL_EXTERNAL (decl) = 1; + break; + + case 3: + error ("%Jzero or negative size array %qD", decl, decl); + break; + + case 0: + /* For global variables, update the copy of the type that + exists in the binding. */ + if (TREE_PUBLIC (decl)) + { + struct c_binding *b_ext = I_SYMBOL_BINDING (DECL_NAME (decl)); + while (b_ext && !B_IN_EXTERNAL_SCOPE (b_ext)) + b_ext = b_ext->shadowed; + if (b_ext) + { + if (b_ext->type) + b_ext->type = composite_type (b_ext->type, type); + else + b_ext->type = type; + } + } + break; + + default: + gcc_unreachable (); } - else if (failure == 3) - error ("%Jzero or negative size array %qD", decl, decl); if (DECL_INITIAL (decl)) TREE_TYPE (DECL_INITIAL (decl)) = type; diff --git a/gcc/testsuite/gcc.dg/redecl-16.c b/gcc/testsuite/gcc.dg/redecl-16.c new file mode 100644 index 00000000000..52941cb084b --- /dev/null +++ b/gcc/testsuite/gcc.dg/redecl-16.c @@ -0,0 +1,18 @@ +/* PR 21502 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +typedef int IA[]; +typedef int IA5[5]; +typedef int IA10[10]; +typedef IA *IAP; +typedef IA5 *IA5P; +typedef IA10 *IA10P; +extern IAP a[]; +void +f (void) +{ + extern IA5P a[]; +} +IAP a[] = { 0 }; /* { dg-error "previous definition" } */ +extern IA10P a[]; /* { dg-error "conflicting types" } */ |

