summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c27
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/range-for5.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/pr18770.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/pr31952-1.C41
-rw-r--r--gcc/testsuite/g++.dg/parse/pr31952-2.C49
-rw-r--r--gcc/testsuite/g++.dg/parse/pr31952-3.C25
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/cond.C8
9 files changed, 169 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aea304b960e..cf91769b72f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/31952
+ * name-lookup.c (pushdecl_maybe_friend_1): Diagnose illegal
+ redeclarations.
+
2013-05-14 Jason Merrill <jason@redhat.com>
PR c++/57243
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index e09eca174b6..a60504fafdf 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -1131,7 +1131,32 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend)
|| oldscope->kind == sk_for))
{
error ("redeclaration of %q#D", x);
- error ("%q+#D previously declared here", oldlocal);
+ inform (input_location, "%q+#D previously declared here",
+ oldlocal);
+ nowarn = true;
+ }
+ /* C++11:
+ 3.3.3/3: The name declared in an exception-declaration (...)
+ shall not be redeclared in the outermost block of the handler.
+ 3.3.3/2: A parameter name shall not be redeclared (...) in
+ the outermost block of any handler associated with a
+ function-try-block.
+ 3.4.1/15: The function parameter names shall not be redeclared
+ in the exception-declaration nor in the outermost block of a
+ handler for the function-try-block. */
+ else if ((VAR_P (oldlocal)
+ && oldscope == current_binding_level->level_chain
+ && oldscope->kind == sk_catch)
+ || (TREE_CODE (oldlocal) == PARM_DECL
+ && (current_binding_level->kind == sk_catch
+ || (current_binding_level->level_chain->kind
+ == sk_catch))
+ && in_function_try_handler))
+ {
+ if (permerror (input_location, "redeclaration of %q#D", x))
+ inform (input_location, "%q+#D previously declared here",
+ oldlocal);
+ nowarn = true;
}
if (warn_shadow && !nowarn)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d69fbd4e74f..55315f49faa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2013-05-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/31952
+ * g++.dg/parse/pr31952-1.C: New.
+ * g++.dg/parse/pr31952-2.C: Likewise.
+ * g++.dg/parse/pr31952-3.C: Likewise.
+
+ * g++.dg/parse/pr18770.C: Adjust dg-errors to dg-messages.
+ * g++.old-deja/g++.jason/cond.C: Likewise.
+ * g++.dg/cpp0x/range-for5.C: Likewise.
+
2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/19599
diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for5.C b/gcc/testsuite/g++.dg/cpp0x/range-for5.C
index fd6f7618f98..04754b780e6 100644
--- a/gcc/testsuite/g++.dg/cpp0x/range-for5.C
+++ b/gcc/testsuite/g++.dg/cpp0x/range-for5.C
@@ -47,7 +47,7 @@ void test1()
//Check the correct scopes
int i;
- for (int i : a) // { dg-error "previously declared" }
+ for (int i : a) // { dg-message "previously declared" }
{
int i; // { dg-error "redeclaration" }
}
diff --git a/gcc/testsuite/g++.dg/parse/pr18770.C b/gcc/testsuite/g++.dg/parse/pr18770.C
index df57be4b29c..71d95e33113 100644
--- a/gcc/testsuite/g++.dg/parse/pr18770.C
+++ b/gcc/testsuite/g++.dg/parse/pr18770.C
@@ -11,7 +11,7 @@ extern int j;
void
e0 (void)
{
- for (int i = 0; // { dg-error "previously declared here" "prev" }
+ for (int i = 0; // { dg-message "previously declared here" "prev" }
i < 10; ++i)
{
int i = 2; // { dg-error "redeclaration" "redecl" }
@@ -24,7 +24,7 @@ e1 (void)
{
int i;
for (i = 0;
- int k = j; i++) // { dg-error "previously declared here" "prev" }
+ int k = j; i++) // { dg-message "previously declared here" "prev" }
{
int k = 2; // { dg-error "redeclaration" "redecl" }
foo (k);
@@ -34,7 +34,7 @@ e1 (void)
void
e2 (void)
{
- if (int i = 1) // { dg-error "previously declared here" "prev" }
+ if (int i = 1) // { dg-message "previously declared here" "prev" }
{
int i = 2; // { dg-error "redeclaration" "redecl" }
foo (i);
@@ -44,7 +44,7 @@ e2 (void)
void
e3 (void)
{
- if (int i = 1) // { dg-error "previously declared here" "prev" }
+ if (int i = 1) // { dg-message "previously declared here" "prev" }
{
foo (i);
}
@@ -58,7 +58,7 @@ e3 (void)
void
e4 (void)
{
- while (int i = 1) // { dg-error "previously declared here" "prev" }
+ while (int i = 1) // { dg-message "previously declared here" "prev" }
{
int i = 2; // { dg-error "redeclaration" "redecl" }
foo (i);
@@ -68,7 +68,7 @@ e4 (void)
void
e5 (void)
{
- switch (int i = j) // { dg-error "previously declared here" "prev" }
+ switch (int i = j) // { dg-message "previously declared here" "prev" }
{
int i; // { dg-error "redeclaration" "redecl" }
default:
diff --git a/gcc/testsuite/g++.dg/parse/pr31952-1.C b/gcc/testsuite/g++.dg/parse/pr31952-1.C
new file mode 100644
index 00000000000..aad3a11a77d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr31952-1.C
@@ -0,0 +1,41 @@
+// PR c++/31952
+
+int
+f0 (int bar) // { dg-message "previously" }
+try
+{
+ return 0;
+}
+catch (...)
+{
+ int bar = 0; // { dg-error "redeclaration" }
+ return 1;
+}
+
+int
+f1 (int bar)
+try
+{
+ return 0;
+}
+catch (...)
+{
+ {
+ int bar = 0; // Ok, not outermost block.
+ }
+ return 1;
+}
+
+int
+f2 (int bar)
+{
+ try
+ {
+ return 0;
+ }
+ catch (...)
+ {
+ int bar = 0; // Ok, not a function-try-block.
+ return 1;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/pr31952-2.C b/gcc/testsuite/g++.dg/parse/pr31952-2.C
new file mode 100644
index 00000000000..f09bcab1b85
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr31952-2.C
@@ -0,0 +1,49 @@
+// PR c++/31952
+
+void
+f0()
+{
+ try
+ {
+ }
+ catch (void *e) // { dg-message "previously" }
+ {
+ void *e; // { dg-error "redeclaration" }
+ }
+}
+
+void
+f1()
+{
+ try
+ {
+ }
+ catch (void *e)
+ {
+ {
+ void *e; // Ok, not outermost block.
+ }
+ }
+}
+
+void
+f2()
+try
+{
+}
+catch (void *e) // { dg-message "previously" }
+{
+ void *e; // { dg-error "redeclaration" }
+}
+
+void
+f3()
+try
+{
+}
+catch (void *e)
+{
+ {
+ void *e; // Ok, not outermost block.
+ }
+}
diff --git a/gcc/testsuite/g++.dg/parse/pr31952-3.C b/gcc/testsuite/g++.dg/parse/pr31952-3.C
new file mode 100644
index 00000000000..9fe5f028378
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr31952-3.C
@@ -0,0 +1,25 @@
+// PR c++/31952
+
+int
+f0 (int bar) // { dg-message "previously" }
+try
+{
+ return 0;
+}
+catch (int bar) // { dg-error "redeclaration" }
+{
+ return 1;
+}
+
+int
+f1 (int bar)
+{
+ try
+ {
+ return 0;
+ }
+ catch (int bar) // Ok, not a function-try-block.
+ {
+ return 1;
+ }
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/cond.C b/gcc/testsuite/g++.old-deja/g++.jason/cond.C
index b1e692e8a69..925d8635c1e 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/cond.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/cond.C
@@ -6,7 +6,7 @@ int main()
{
float i;
- if (int i = 1) // { dg-error "previously" }
+ if (int i = 1) // { dg-message "previously" }
{
char i; // { dg-error "redeclaration" }
char j;
@@ -17,17 +17,17 @@ int main()
char j;
}
- while (int i = 0) // { dg-error "previously" }
+ while (int i = 0) // { dg-message "previously" }
{
int i; // { dg-error "redeclaration" }
}
- for (; int i = 0; ) // { dg-error "previously" }
+ for (; int i = 0; ) // { dg-message "previously" }
{
int i; // { dg-error "redeclaration" }
}
- switch (int i = 0) // { dg-error "previously" }
+ switch (int i = 0) // { dg-message "previously" }
{
default:
int i; // { dg-error "redeclaration" }