diff options
author | Jason Merrill <jason@redhat.com> | 2016-02-10 10:34:59 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-02-10 10:34:59 -0500 |
commit | 89908c8f2b5107f92dcd9a33098797cdf848a151 (patch) | |
tree | 3663c16f5b1eac203bbfd48d713506551dc0295c /gcc | |
parent | ff2faafcf689b6c2a277dce15a3d60d80c92e493 (diff) | |
download | gcc-89908c8f2b5107f92dcd9a33098797cdf848a151.zip gcc-89908c8f2b5107f92dcd9a33098797cdf848a151.tar.gz gcc-89908c8f2b5107f92dcd9a33098797cdf848a151.tar.bz2 |
re PR c++/69657 (abs() not inlined after including math.h)
PR c++/69657
* name-lookup.c (ambiguous_decl): Call remove_hidden_names.
(lookup_name_real_1): Likewise.
(remove_hidden_names): Handle non-functions too.
From-SVN: r233278
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/builtin7.C | 14 |
3 files changed, 28 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 92e65fc..628f4d1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2016-02-10 Jason Merrill <jason@redhat.com> + PR c++/69657 + * name-lookup.c (ambiguous_decl): Call remove_hidden_names. + (lookup_name_real_1): Likewise. + (remove_hidden_names): Handle non-functions too. + PR c++/10200 * parser.c (cp_parser_lookup_name): When looking for a template after . or ->, only consider class templates. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 227d6f2..8d6e75a 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4221,9 +4221,9 @@ ambiguous_decl (struct scope_binding *old, cxx_binding *new_binding, int flags) val = new_binding->value; if (val) { - if (hidden_name_p (val) && !(flags & LOOKUP_HIDDEN)) - val = NULL_TREE; - else + if (!(flags & LOOKUP_HIDDEN)) + val = remove_hidden_names (val); + if (val) switch (TREE_CODE (val)) { case TEMPLATE_DECL: @@ -4353,7 +4353,7 @@ hidden_name_p (tree val) return false; } -/* Remove any hidden friend functions from a possibly overloaded set +/* Remove any hidden declarations from a possibly overloaded set of functions. */ tree @@ -4362,7 +4362,7 @@ remove_hidden_names (tree fns) if (!fns) return fns; - if (TREE_CODE (fns) == FUNCTION_DECL && hidden_name_p (fns)) + if (DECL_P (fns) && hidden_name_p (fns)) fns = NULL_TREE; else if (TREE_CODE (fns) == OVERLOAD) { @@ -4931,6 +4931,10 @@ lookup_name_real_1 (tree name, int prefer_type, int nonclass, bool block_p, if (!val) val = unqualified_namespace_lookup (name, flags); + /* Anticipated built-ins and friends aren't found by normal lookup. */ + if (val && !(flags & LOOKUP_HIDDEN)) + val = remove_hidden_names (val); + /* If we have a single function from a using decl, pull it out. */ if (val && TREE_CODE (val) == OVERLOAD && !really_overloaded_fn (val)) val = OVL_FUNCTION (val); diff --git a/gcc/testsuite/g++.dg/lookup/builtin7.C b/gcc/testsuite/g++.dg/lookup/builtin7.C new file mode 100644 index 0000000..c612d8c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin7.C @@ -0,0 +1,14 @@ +// PR c++/69657 + +typedef unsigned int size_t; +namespace std { +extern void *calloc(size_t, size_t); +} +using std::calloc; +int +main () +{ + char *(*pfn) = (char *(*)) calloc ; + (bool)&calloc; + (bool)&::calloc; +} |