diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/range-for5.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr18770.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr31952-1.C | 41 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr31952-2.C | 49 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr31952-3.C | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.jason/cond.C | 8 |
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" } |