[Bug c/91815] New: questionable error on type definition at file scope
ebotcazou at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Sep 19 08:27:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91815
Bug ID: 91815
Summary: questionable error on type definition at file scope
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: minor
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: ebotcazou at gcc dot gnu.org
Target Milestone: ---
The C compiler currently rejects the following code:
int f (void)
{
extern int t;
extern float v;
return (v > 0.0f);
}
typedef float t;
t v = 4.5f;
with the message:
t.c:9:15: error: 't' redeclared as different kind of symbol
9 | typedef float t;
| ^
t.c:3:14: note: previous declaration of 't' was here
3 | extern int t;
|
This behavior looks questionable and both Clang and MSVC disagree with GCC.
And a cursory look at the relevant code in pushdecl seems to point to an
overzealous implementation of C99 6.2.7p2, leading to a possible simple fix:
Index: c-decl.c
===================================================================
--- c-decl.c (revision 275746)
+++ c-decl.c (working copy)
@@ -3131,7 +3131,8 @@ pushdecl (tree x)
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)
+ if ((DECL_EXTERNAL (x) || scope == file_scope)
+ && VAR_OR_FUNCTION_DECL_P (x))
{
tree type = TREE_TYPE (x);
tree vistype = NULL_TREE;
More information about the Gcc-bugs
mailing list