re PR c++/31952 (parameters may be redeclared in a function try-block)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 15 May 2013 16:10:22 +0000 (16:10 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 15 May 2013 16:10:22 +0000 (16:10 +0000)
/cp
2013-05-15  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/31952
* name-lookup.c (pushdecl_maybe_friend_1): Diagnose illegal
redeclarations.

/testsuite
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.

From-SVN: r198939

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/range-for5.C
gcc/testsuite/g++.dg/parse/pr18770.C
gcc/testsuite/g++.dg/parse/pr31952-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/pr31952-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/pr31952-3.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.jason/cond.C

index aea304b960e8a59ff9e5c2a171ec895e3828f92e..cf91769b72f6a9cd9165b215847f8ba5f42060fb 100644 (file)
@@ -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
index e09eca174b6c6dc3de62b3b3e086536eaf548f83..a60504fafdfef610b559d35fd82b430ce316edd4 100644 (file)
@@ -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)
index d69fbd4e74f39925fb811ac47f94199d892fd3ed..55315f49faa627d324bd5a8244bb528260928a38 100644 (file)
@@ -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
index fd6f7618f98033f920fb85a77d8d1f87a6c86c65..04754b780e68a5845bbdd77831f9d2f3a8ca1d9c 100644 (file)
@@ -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" }
   }
index df57be4b29c382e616e78aab57fa96d2c7295ac9..71d95e331134ac01b64a985c582a28f791fb1c7b 100644 (file)
@@ -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 (file)
index 0000000..aad3a11
--- /dev/null
@@ -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 (file)
index 0000000..f09bcab
--- /dev/null
@@ -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 (file)
index 0000000..9fe5f02
--- /dev/null
@@ -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;
+  }
+}
index b1e692e8a6946e4996d1238fe84dab8912e6c46f..925d8635c1e9c19aee8834d91908f2eefe34007d 100644 (file)
@@ -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" }