From: Nathan Sidwell Date: Wed, 11 Jan 2017 20:37:16 +0000 (+0000) Subject: re PR c++/77812 (incorrectly rejects valid C++ code that uses enum in template instan... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=01bfd25762bea829b0ad271bc6daeddb7fcac22f;p=gcc.git 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 --- 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;