This gets rid of a bogus error issued by the C compiler on a type definition
at file scope when there is a preceding external declaration in a local scope
for the same symbol (but the error is still issued if the preceding external
declaration is also at file scope).
Bootstrapped/regtested on x86-64/Linux, approved by Joseph in the audit trail
and applied on the mainline.
2019-09-20 Eric Botcazou <ebotca...@adacore.com>
PR c/91815
* c-decl.c (pushdecl): In C detect duplicate declarations across scopes
of identifiers in the external scope only for variables and functions.
2019-09-20 Eric Botcazou <ebotca...@adacore.com>
* gcc.dg/typedef-var-1.c: New test.
* gcc.dg/typedef-var-2.c: Likewise.
--
Eric Botcazou
Index: c-decl.c
===================================================================
--- c-decl.c (revision 275988)
+++ c-decl.c (working copy)
@@ -3130,8 +3130,11 @@ pushdecl (tree x)
detecting duplicate declarations of the same object, no matter
what scope they are in; this is what we do here. (C99 6.2.7p2:
All declarations that refer to the same object or function shall
- have compatible type; otherwise, the behavior is undefined.) */
- if (DECL_EXTERNAL (x) || scope == file_scope)
+ have compatible type; otherwise, the behavior is undefined.)
+ However, in Objective-C, we also want to detect declarations
+ conflicting with those of the basic types. */
+ if ((DECL_EXTERNAL (x) || scope == file_scope)
+ && (VAR_OR_FUNCTION_DECL_P (x) || c_dialect_objc ()))
{
tree type = TREE_TYPE (x);
tree vistype = NULL_TREE;
/* PR c/91815 */
/* { dg-do compile } */
int f (void)
{
extern int t;
extern float v;
return (v > 0.0f);
}
typedef float t;
t v = 4.5f;
/* PR c/91815 */
/* { dg-do compile } */
int f (void)
{
extern float v;
return (v > 0.0f);
}
extern int t;
typedef float t; /* { dg-error "redeclared as different kind of symbol" } */
t v = 4.5f;