From 01bfd25762bea829b0ad271bc6daeddb7fcac22f Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 11 Jan 2017 20:37:16 +0000 Subject: [PATCH] re PR c++/77812 (incorrectly rejects valid C++ code that uses enum in template instantiation) 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 | 6 ++++++ gcc/cp/name-lookup.c | 7 ++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/pr77812.C | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/pr77812.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a6a8e8b7ff4..b318ab9839a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-01-11 Nathan Sidwell + + PR c++/77812 + * name-lookup.c (set_namespace_binding_1): An overload of 1 decl + is a new overload. + 2017-01-11 Nathan Sidwell * name-lookup.c (push_overloaded_decl_1): Refactor OVERLOAD creation. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index ba900cbf01f..3c7559f33db 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8cd53a9bff..4f281cbfde6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-11 Nathan Sidwell + + PR c++/77812 + * g++.dg/pr77812.C: New. + 2017-01-11 Jakub Jelinek PR c++/71537 diff --git a/gcc/testsuite/g++.dg/pr77812.C b/gcc/testsuite/g++.dg/pr77812.C new file mode 100644 index 00000000000..94f17402a4e --- /dev/null +++ b/gcc/testsuite/g++.dg/pr77812.C @@ -0,0 +1,18 @@ +// PR77812 +// struct-stat hack failure when first overload is a template + +enum f {}; + +template +void f () +{ +} +enum f F; + +struct g {}; + +template +void g () +{ +} +struct g G; -- 2.30.2