re PR c/91815 (questionable error on type definition at file scope)
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 20 Sep 2019 09:11:20 +0000 (09:11 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 20 Sep 2019 09:11:20 +0000 (09:11 +0000)
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.

From-SVN: r275992

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/typedef-var-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/typedef-var-2.c [new file with mode: 0644]

index 285ea1871003adb7bf598f1d906e342394b9f8a9..96655493ac008fdf279eec22b34a124a44783cfa 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-20  Eric Botcazou  <ebotcazou@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-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
 
        PR c/78736
index 31116b21308dbae4f7cf9be12875f6f470cb3964..132fa3edb27d780bb922243f6795bf782d8775c7 100644 (file)
@@ -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;
index a4323b4b2a7c23da99650a59244e5ae36ba1ed20..59c6b7991ad6b2ee95f6cd55b34b874f79584bea 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/typedef-var-1.c: New test.
+       * gcc.dg/typedef-var-2.c: Likewise.
+
 2019-09-20  Martin Jambor  <mjambor@suse.cz>
 
         * g++.dg/ipa/pr81248.C: Adjust dg-options and dump-scan.
diff --git a/gcc/testsuite/gcc.dg/typedef-var-1.c b/gcc/testsuite/gcc.dg/typedef-var-1.c
new file mode 100644 (file)
index 0000000..2cda92d
--- /dev/null
@@ -0,0 +1,14 @@
+/* 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;
diff --git a/gcc/testsuite/gcc.dg/typedef-var-2.c b/gcc/testsuite/gcc.dg/typedef-var-2.c
new file mode 100644 (file)
index 0000000..716d29c
--- /dev/null
@@ -0,0 +1,15 @@
+/* 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;