diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-01-11 20:37:16 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-01-11 20:37:16 +0000 |
commit | 01bfd25762bea829b0ad271bc6daeddb7fcac22f (patch) | |
tree | 30420695cc5deaa81bb08362b482ff776c078de4 | |
parent | 5b33cc835cfb82fee4508129bf849f40733e752f (diff) | |
download | gcc-01bfd25762bea829b0ad271bc6daeddb7fcac22f.zip gcc-01bfd25762bea829b0ad271bc6daeddb7fcac22f.tar.gz gcc-01bfd25762bea829b0ad271bc6daeddb7fcac22f.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr77812.C | 18 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a6a8e8b..b318ab9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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. 2017-01-11 Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index ba900cb..3c7559f 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 b8cd53a..4f281cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..94f1740 --- /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 <typename> +void f () +{ +} +enum f F; + +struct g {}; + +template <typename> +void g () +{ +} +struct g G; |