if (TREE_CODE (decl) == PARM_DECL && !DECL_CONTEXT (decl))
return;
- /* External decls are something else. */
- if (DECL_EXTERNAL (decl))
- return;
-
tree old = NULL_TREE;
cp_binding_level *old_scope = NULL;
if (cxx_binding *binding = outer_binding (DECL_NAME (decl), NULL, true))
&& DECL_CONTEXT (old) == lambda_function (current_lambda_expr ())
&& TREE_CODE (old) == PARM_DECL
&& DECL_NAME (decl) != this_identifier)
- {
- error_at (DECL_SOURCE_LOCATION (old),
- "lambda parameter %qD "
- "previously declared as a capture", old);
- }
+ error_at (DECL_SOURCE_LOCATION (old),
+ "lambda parameter %qD "
+ "previously declared as a capture", old);
return;
}
/* Don't complain if it's from an enclosing function. */
if (b->kind == sk_function_parms)
{
auto_diagnostic_group d;
- error_at (DECL_SOURCE_LOCATION (decl),
- "declaration of %q#D shadows a parameter", decl);
- inform (DECL_SOURCE_LOCATION (old),
- "%q#D previously declared here", old);
+ bool emit = true;
+ if (DECL_EXTERNAL (decl))
+ emit = pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wpedantic,
+ "declaration of %q#D shadows a parameter",
+ decl);
+ else
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "declaration of %q#D shadows a parameter", decl);
+ if (emit)
+ inform (DECL_SOURCE_LOCATION (old),
+ "%q#D previously declared here", old);
return;
}
}
&& (old_scope->kind == sk_cond || old_scope->kind == sk_for))
{
auto_diagnostic_group d;
- error_at (DECL_SOURCE_LOCATION (decl),
- "redeclaration of %q#D", decl);
- inform (DECL_SOURCE_LOCATION (old),
- "%q#D previously declared here", old);
+ bool emit = true;
+ if (DECL_EXTERNAL (decl))
+ emit = pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wpedantic,
+ "redeclaration of %q#D", decl);
+ else
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "redeclaration of %q#D", decl);
+ if (emit)
+ inform (DECL_SOURCE_LOCATION (old),
+ "%q#D previously declared here", old);
return;
}
/* C++11:
&& old_scope->kind == sk_catch)
{
auto_diagnostic_group d;
- if (permerror (DECL_SOURCE_LOCATION (decl),
- "redeclaration of %q#D", decl))
+ bool emit;
+ if (DECL_EXTERNAL (decl))
+ emit = pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wpedantic,
+ "redeclaration of %q#D", decl);
+ else
+ emit = permerror (DECL_SOURCE_LOCATION (decl),
+ "redeclaration of %q#D", decl);
+ if (emit)
inform (DECL_SOURCE_LOCATION (old),
"%q#D previously declared here", old);
return;
|| (TREE_CODE (old) == TYPE_DECL
&& (!DECL_ARTIFICIAL (old)
|| TREE_CODE (decl) == TYPE_DECL)))
+ && !DECL_EXTERNAL (decl)
&& !instantiating_current_function_p ()
&& !warning_suppressed_p (decl, OPT_Wshadow))
/* XXX shadow warnings in outer-more namespaces */
--- /dev/null
+// PR c++/52953
+// { dg-do compile }
+// { dg-options "-pedantic-errors -Wno-switch-unreachable" }
+
+void
+foo (int x) // { dg-message "'int x' previously declared here" }
+{
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+}
+
+void
+bar (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+}
+catch (...)
+{
+}
+
+volatile int v;
+
+void
+baz ()
+{
+#if __cplusplus >= 201103L
+ auto f = [] (int x) { extern int x; };// { dg-error "declaration of 'int x' shadows a parameter" "" { target c++11 } }
+ // { dg-message "'int x' previously declared here" "" { target c++11 } .-1 }
+#endif
+ if (int x = 1) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ }
+ if (int x = 0) // { dg-message "'int x' previously declared here" }
+ ;
+ else
+ {
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ }
+ if (int x = 1) // { dg-message "'int x' previously declared here" }
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ if (int x = 0) // { dg-message "'int x' previously declared here" }
+ ;
+ else
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ switch (int x = 1) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ default:;
+ }
+ switch (int x = 1) // { dg-message "'int x' previously declared here" }
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ while (int x = v)
+ {
+ extern int x; // { dg-error "'int x' conflicts with a previous declaration" }
+ }
+ while (int x = v)
+ extern int x; // { dg-error "'int x' conflicts with a previous declaration" }
+ for (int x = v; x; ++x) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ }
+ for (int x = v; x; ++x) // { dg-message "'int x' previously declared here" }
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ for (; int x = v; )
+ {
+ extern int x; // { dg-error "'int x' conflicts with a previous declaration" }
+ }
+ for (; int x = v; )
+ extern int x; // { dg-error "'int x' conflicts with a previous declaration" }
+ try
+ {
+ }
+ catch (int x) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x; // { dg-error "redeclaration of 'int x'" }
+ }
+}
+
+void
+corge (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+}
+catch (...)
+{
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+}
+
+void
+fred (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+}
+catch (int)
+{
+}
+catch (long)
+{
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+}
+
+void
+garply (int x)
+{
+ try
+ {
+ extern int x;
+ }
+ catch (...)
+ {
+ extern int x;
+ }
+}
+
+struct S
+{
+ S (int x) // { dg-message "'int x' previously declared here" }
+ try : s (x)
+ {
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+ }
+ catch (...)
+ {
+ }
+ int s;
+};
+
+struct T
+{
+ T (int x) // { dg-message "'int x' previously declared here" }
+ try : t (x)
+ {
+ }
+ catch (...)
+ {
+ extern int x; // { dg-error "declaration of 'int x' shadows a parameter" }
+ }
+ int t;
+};
+
+struct U
+{
+ U (int x) : u (x)
+ {
+ try
+ {
+ extern int x;
+ }
+ catch (...)
+ {
+ extern int x;
+ }
+ }
+ int u;
+};
+
+struct V
+{
+ V (int x) : v (x)
+ {
+ {
+ extern int x;
+ }
+ }
+ int v;
+};
--- /dev/null
+// PR c++/52953
+// { dg-do compile }
+// { dg-options "-pedantic-errors -Wno-switch-unreachable" }
+
+void
+foo (int x) // { dg-message "'int x' previously declared here" }
+{
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+}
+
+void
+bar (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+}
+catch (...)
+{
+}
+
+volatile int v;
+
+void
+baz ()
+{
+#if __cplusplus >= 201103L
+ auto f = [] (int x) { extern int x (int); };// { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" "" { target c++11 } }
+ // { dg-message "'int x' previously declared here" "" { target c++11 } .-1 }
+#endif
+ if (int x = 1) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ }
+ if (int x = 0) // { dg-message "'int x' previously declared here" }
+ ;
+ else
+ {
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ }
+ if (int x = 1) // { dg-message "'int x' previously declared here" }
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ if (int x = 0) // { dg-message "'int x' previously declared here" }
+ ;
+ else
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ switch (int x = 1) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ default:;
+ }
+ switch (int x = 1) // { dg-message "'int x' previously declared here" }
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ while (int x = v)
+ {
+ extern int x (int); // { dg-error "'int x\\\(int\\\)' redeclared as different kind of entity" }
+ }
+ while (int x = v)
+ extern int x (int); // { dg-error "'int x\\\(int\\\)' redeclared as different kind of entity" }
+ for (int x = v; x; ++x) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ }
+ for (int x = v; x; ++x) // { dg-message "'int x' previously declared here" }
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ for (; int x = v; )
+ {
+ extern int x (int); // { dg-error "'int x\\\(int\\\)' redeclared as different kind of entity" }
+ }
+ for (; int x = v; )
+ extern int x (int); // { dg-error "'int x\\\(int\\\)' redeclared as different kind of entity" }
+ try
+ {
+ }
+ catch (int x) // { dg-message "'int x' previously declared here" }
+ {
+ extern int x (int); // { dg-error "redeclaration of 'int x\\\(int\\\)'" }
+ }
+}
+
+void
+corge (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+}
+catch (...)
+{
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+}
+
+void
+fred (int x) // { dg-message "'int x' previously declared here" }
+try
+{
+}
+catch (int)
+{
+}
+catch (long)
+{
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+}
+
+void
+garply (int x)
+{
+ try
+ {
+ extern int x (int);
+ }
+ catch (...)
+ {
+ extern int x (int);
+ }
+}
+
+struct S
+{
+ S (int x) // { dg-message "'int x' previously declared here" }
+ try : s (x)
+ {
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+ }
+ catch (...)
+ {
+ }
+ int s;
+};
+
+struct T
+{
+ T (int x) // { dg-message "'int x' previously declared here" }
+ try : t (x)
+ {
+ }
+ catch (...)
+ {
+ extern int x (int); // { dg-error "declaration of 'int x\\\(int\\\)' shadows a parameter" }
+ }
+ int t;
+};
+
+struct U
+{
+ U (int x) : u (x)
+ {
+ try
+ {
+ extern int x (int);
+ }
+ catch (...)
+ {
+ extern int x (int);
+ }
+ }
+ int u;
+};
+
+struct V
+{
+ V (int x) : v (x)
+ {
+ {
+ extern int x (int);
+ }
+ }
+ int v;
+};
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Wshadow" }
+
+void
+foo (int x)
+{
+ int y = 1;
+ {
+ extern int x; // { dg-warning "declaration of 'int x' shadows a parameter" }
+ extern int y; // { dg-warning "declaration of 'y' shadows a previous local" }
+ }
+#if __cplusplus >= 201102L
+ auto fn = [x] () { extern int x; return 0; }; // { dg-warning "declaration of 'x' shadows a lambda capture" "" { target c++11 } }
+#endif
+}
+
+int z;
+
+struct S
+{
+ int x;
+ void foo ()
+ {
+ extern int x; // { dg-warning "declaration of 'x' shadows a member of 'S'" }
+ extern int z;
+ }
+};