aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-12-21 23:49:59 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-12-21 23:49:59 +0100
commitb5f8e89ed7dc34e6850430315730b7601032bd89 (patch)
treee36e7de06e1786577ffec8b958e8d624efa967e0 /gcc
parentd8ee9c7e549352147b9fc91ae8f5d8a007352894 (diff)
downloadgcc-b5f8e89ed7dc34e6850430315730b7601032bd89.zip
gcc-b5f8e89ed7dc34e6850430315730b7601032bd89.tar.gz
gcc-b5f8e89ed7dc34e6850430315730b7601032bd89.tar.bz2
re PR c++/72707 (local anonymous union member hides names in the same scope)
PR c++/72707 * name-lookup.c (pushdecl_maybe_friend_1): Do check shadowing of artificial x if it is an anonymous union variable. * g++.dg/warn/Wshadow-12.C: New test. From-SVN: r243877
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/name-lookup.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wshadow-12.C9
4 files changed, 22 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e493fd1..925d0b5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2016-12-21 Jakub Jelinek <jakub@redhat.com>
+ PR c++/72707
+ * name-lookup.c (pushdecl_maybe_friend_1): Do check shadowing of
+ artificial x if it is an anonymous union variable.
+
PR bootstrap/78817
* typeck.c (cp_build_function_call_vec): If check_function_arguments
returns true, set TREE_NO_WARNING on CALL_EXPR.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index a0cadb8..223838c 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -1111,8 +1111,10 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend)
|| TREE_CODE (x) == TYPE_DECL)))
/* Don't check for internally generated vars unless
it's an implicit typedef (see create_implicit_typedef
- in decl.c). */
- && (!DECL_ARTIFICIAL (x) || DECL_IMPLICIT_TYPEDEF_P (x)))
+ in decl.c) or anonymous union variable. */
+ && (!DECL_ARTIFICIAL (x)
+ || DECL_IMPLICIT_TYPEDEF_P (x)
+ || (VAR_P (x) && DECL_ANON_UNION_VAR_P (x))))
{
bool nowarn = false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 40f671f..3a704c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-12-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/72707
+ * g++.dg/warn/Wshadow-12.C: New test.
+
2016-12-21 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/78580
diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-12.C b/gcc/testsuite/g++.dg/warn/Wshadow-12.C
new file mode 100644
index 0000000..95dc5be
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wshadow-12.C
@@ -0,0 +1,9 @@
+// PR c++/72707
+// { dg-do compile }
+
+void
+foo (double x)
+{
+ union { int x; }; // { dg-error "shadows a parameter" }
+ x = 0;
+}