From: Nathan Sidwell Date: Mon, 19 Jun 2017 14:13:58 +0000 (+0000) Subject: re PR c++/81119 (-Wshadow warns on "typedef struct foo foo;") X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c14c0b1568f84e974152d2e2c1bc3da384a16f2d;p=gcc.git re PR c++/81119 (-Wshadow warns on "typedef struct foo foo;") PR c++/81119 * name-lookup.c (update_binding): Only warn about constructors hidden by functions. PR c++/81119 * g++.dg/warn/pr81119.C: New. From-SVN: r249369 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 465e7d9ffe6..fece2d040da 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-06-19 Nathan Sidwell + + PR c++/81119 + * name-lookup.c (update_binding): Only warn about constructors + hidden by functions. + 2017-06-17 Jason Merrill PR c++/60063 - -Wunused-local-typedefs and templates. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 6ed164d4645..a337942d6ae 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -1784,6 +1784,14 @@ update_binding (cp_binding_level *level, cxx_binding *binding, tree *slot, else goto conflict; + if (to_type != old_type + && warn_shadow + && MAYBE_CLASS_TYPE_P (TREE_TYPE (to_type)) + && !(DECL_IN_SYSTEM_HEADER (decl) + && DECL_IN_SYSTEM_HEADER (to_type))) + warning (OPT_Wshadow, "%q#D hides constructor for %q#D", + decl, to_type); + to_val = ovl_insert (decl, old); } else if (!old) @@ -1849,21 +1857,6 @@ update_binding (cp_binding_level *level, cxx_binding *binding, tree *slot, add_decl_to_level (level, to_add); } - if (to_type != old_type) - { - gcc_checking_assert (!old_type - && TREE_CODE (to_type) == TYPE_DECL - && DECL_ARTIFICIAL (to_type)); - - tree type = TREE_TYPE (to_type); - if (to_type != decl - && MAYBE_CLASS_TYPE_P (type) && warn_shadow - && (!DECL_IN_SYSTEM_HEADER (decl) - || !DECL_IN_SYSTEM_HEADER (to_type))) - warning (OPT_Wshadow, "%q#D hides constructor for %q#T", - decl, type); - } - if (slot) { if (STAT_HACK_P (*slot)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26e527c7e15..c7729e819fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-19 Nathan Sidwell + + PR c++/81119 + * g++.dg/warn/pr81119.C: New. + 2017-06-19 Martin Liska PR sanitizer/80879 diff --git a/gcc/testsuite/g++.dg/warn/pr81119.C b/gcc/testsuite/g++.dg/warn/pr81119.C new file mode 100644 index 00000000000..2f822361e2b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr81119.C @@ -0,0 +1,20 @@ +// PR c++/81119 Wshadow regression +// { dg-additional-options "-Wshadow" } + +struct A; +typedef A A; // No warning, does not hide + +struct B; // { dg-message "previous" } +typedef int B; // { dg-error "conflicting" } + +struct C; +void C (); // { dg-warning "hides constructor" } +void C (int); // warning not repeated + +struct D; +int D; // no warning, not a function + +struct E; + +enum X + {E}; // no warning, not a function