Commit 8ff25a22 by Paolo Carlini Committed by Paolo Carlini

re PR c++/31952 (parameters may be redeclared in a function try-block)

/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
parent ad4db775
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> 2013-05-14 Jason Merrill <jason@redhat.com>
PR c++/57243 PR c++/57243
......
...@@ -1131,7 +1131,32 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend) ...@@ -1131,7 +1131,32 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend)
|| oldscope->kind == sk_for)) || oldscope->kind == sk_for))
{ {
error ("redeclaration of %q#D", x); 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) if (warn_shadow && !nowarn)
......
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> 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/19599 PR target/19599
......
...@@ -47,7 +47,7 @@ void test1() ...@@ -47,7 +47,7 @@ void test1()
//Check the correct scopes //Check the correct scopes
int i; int i;
for (int i : a) // { dg-error "previously declared" } for (int i : a) // { dg-message "previously declared" }
{ {
int i; // { dg-error "redeclaration" } int i; // { dg-error "redeclaration" }
} }
......
...@@ -11,7 +11,7 @@ extern int j; ...@@ -11,7 +11,7 @@ extern int j;
void void
e0 (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) i < 10; ++i)
{ {
int i = 2; // { dg-error "redeclaration" "redecl" } int i = 2; // { dg-error "redeclaration" "redecl" }
...@@ -24,7 +24,7 @@ e1 (void) ...@@ -24,7 +24,7 @@ e1 (void)
{ {
int i; int i;
for (i = 0; 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" } int k = 2; // { dg-error "redeclaration" "redecl" }
foo (k); foo (k);
...@@ -34,7 +34,7 @@ e1 (void) ...@@ -34,7 +34,7 @@ e1 (void)
void void
e2 (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" } int i = 2; // { dg-error "redeclaration" "redecl" }
foo (i); foo (i);
...@@ -44,7 +44,7 @@ e2 (void) ...@@ -44,7 +44,7 @@ e2 (void)
void void
e3 (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); foo (i);
} }
...@@ -58,7 +58,7 @@ e3 (void) ...@@ -58,7 +58,7 @@ e3 (void)
void void
e4 (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" } int i = 2; // { dg-error "redeclaration" "redecl" }
foo (i); foo (i);
...@@ -68,7 +68,7 @@ e4 (void) ...@@ -68,7 +68,7 @@ e4 (void)
void void
e5 (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" } int i; // { dg-error "redeclaration" "redecl" }
default: default:
......
// 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;
}
}
// 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.
}
}
// 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;
}
}
...@@ -6,7 +6,7 @@ int main() ...@@ -6,7 +6,7 @@ int main()
{ {
float i; float i;
if (int i = 1) // { dg-error "previously" } if (int i = 1) // { dg-message "previously" }
{ {
char i; // { dg-error "redeclaration" } char i; // { dg-error "redeclaration" }
char j; char j;
...@@ -17,17 +17,17 @@ int main() ...@@ -17,17 +17,17 @@ int main()
char j; char j;
} }
while (int i = 0) // { dg-error "previously" } while (int i = 0) // { dg-message "previously" }
{ {
int i; // { dg-error "redeclaration" } int i; // { dg-error "redeclaration" }
} }
for (; int i = 0; ) // { dg-error "previously" } for (; int i = 0; ) // { dg-message "previously" }
{ {
int i; // { dg-error "redeclaration" } int i; // { dg-error "redeclaration" }
} }
switch (int i = 0) // { dg-error "previously" } switch (int i = 0) // { dg-message "previously" }
{ {
default: default:
int i; // { dg-error "redeclaration" } int i; // { dg-error "redeclaration" }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment