re PR c++/77812 (incorrectly rejects valid C++ code that uses enum in template instan...
authorNathan Sidwell <nathan@acm.org>
Wed, 11 Jan 2017 20:37:16 +0000 (20:37 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 11 Jan 2017 20:37:16 +0000 (20:37 +0000)
cp/
PR c++/77812
* name-lookup.c (set_namespace_binding_1): An overload of 1 decl
is a new overload.

testsuite/
PR c++/77812
* g++.dg/pr77812.C: New.

From-SVN: r244335

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr77812.C [new file with mode: 0644]

index a6a8e8b7ff473fe2bf14829193dc4f34faa8d5c1..b318ab9839aa9ff551c01ac2502014e6e2305d82 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-11  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/77812
+       * name-lookup.c (set_namespace_binding_1): An overload of 1 decl
+       is a new overload.
+
 2017-01-11  Nathan Sidwell  <nathan@acm.org>
 
        * name-lookup.c (push_overloaded_decl_1): Refactor OVERLOAD creation.
index ba900cbf01fceb55c23070b3c76109d1ab46eb37..3c7559f33db06d599590df3c545adbbcf0da3f62 100644 (file)
@@ -3496,7 +3496,12 @@ set_namespace_binding_1 (tree name, tree scope, tree val)
   if (scope == NULL_TREE)
     scope = global_namespace;
   b = binding_for_name (NAMESPACE_LEVEL (scope), name);
-  if (!b->value || TREE_CODE (val) == OVERLOAD || val == error_mark_node)
+  if (!b->value
+      /* For templates and using we create a single element OVERLOAD.
+        Look for the chain to know whether this is really augmenting
+        an existing overload.  */
+      || (TREE_CODE (val) == OVERLOAD && OVL_CHAIN (val))
+      || val == error_mark_node)
     b->value = val;
   else
     supplement_binding (b, val);
index b8cd53a9bff78f932d7745fa5c965f9029cbcdc1..4f281cbfde62dba6c8a4abb9ba28d919c8f30d60 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-11  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/77812
+       * g++.dg/pr77812.C: New.
+
 2017-01-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/71537
diff --git a/gcc/testsuite/g++.dg/pr77812.C b/gcc/testsuite/g++.dg/pr77812.C
new file mode 100644 (file)
index 0000000..94f1740
--- /dev/null
@@ -0,0 +1,18 @@
+// PR77812
+// struct-stat hack failure when first overload is a template
+
+enum f {};
+
+template <typename>
+void f ()
+{
+}
+enum f F;
+
+struct g {};
+
+template <typename>
+void g ()
+{
+}
+struct g G;