aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-09-20 09:11:20 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-09-20 09:11:20 +0000
commit522da4c233cb626f66e413dabb86a0a78adaafce (patch)
treea0abe9960690bcc01823bad777578966aa454173 /gcc
parent6e222b2a3aede20f3093802d1649e75848e3bd2b (diff)
downloadgcc-522da4c233cb626f66e413dabb86a0a78adaafce.zip
gcc-522da4c233cb626f66e413dabb86a0a78adaafce.tar.gz
gcc-522da4c233cb626f66e413dabb86a0a78adaafce.tar.bz2
re PR c/91815 (questionable error on type definition at file scope)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-decl.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/typedef-var-1.c14
-rw-r--r--gcc/testsuite/gcc.dg/typedef-var-2.c15
5 files changed, 45 insertions, 2 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 285ea18..9665549 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 31116b2..132fa3e 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a4323b4..59c6b79 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..2cda92d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/typedef-var-1.c
@@ -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
index 0000000..716d29c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/typedef-var-2.c
@@ -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;