diff options
author | Nathan Sidwell <nathan@acm.org> | 2018-11-16 15:01:55 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2018-11-16 15:01:55 +0000 |
commit | b1fe8605a12deddd1c5998ee6a78f1d17d507980 (patch) | |
tree | f6b78fc2da5d03484ea2e0907d79b0cafefa3fae | |
parent | ac28df7e539038f3a1a34902c4bd5c8441a86f02 (diff) | |
download | gcc-b1fe8605a12deddd1c5998ee6a78f1d17d507980.zip gcc-b1fe8605a12deddd1c5998ee6a78f1d17d507980.tar.gz gcc-b1fe8605a12deddd1c5998ee6a78f1d17d507980.tar.bz2 |
[PR c++/87269] Mark string operator overload in template defn.
https://gcc.gnu.org/ml/gcc-patches/2018-11/msg01458.html
PR c++/87269
* parser.c (lookup_literal_operator): Mark overload for keeping
when inside template. Refactor.
* g++.dg/lookup/pr87269.C: New.
From-SVN: r266210
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/pr87269.C | 15 |
4 files changed, 40 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index deec822..6b167f3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-11-16 Nathan Sidwell <nathan@acm.org> + + PR c++/87269 + * parser.c (lookup_literal_operator): Mark overload for keeping + when inside template. Refactor. + 2018-11-15 Nathan Sidwell <nathan@acm.org> PR c++/86246 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8833e3d..99bd4dc 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4259,20 +4259,21 @@ cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok, static tree lookup_literal_operator (tree name, vec<tree, va_gc> *args) { - tree decl; - decl = lookup_name (name); + tree decl = lookup_name (name); if (!decl || !is_overloaded_fn (decl)) return error_mark_node; for (lkp_iterator iter (decl); iter; ++iter) { - unsigned int ix; - bool found = true; tree fn = *iter; - tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (fn)); - if (parmtypes != NULL_TREE) + + if (tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (fn))) { - for (ix = 0; ix < vec_safe_length (args) && parmtypes != NULL_TREE; + unsigned int ix; + bool found = true; + + for (ix = 0; + found && ix < vec_safe_length (args) && parmtypes != NULL_TREE; ++ix, parmtypes = TREE_CHAIN (parmtypes)) { tree tparm = TREE_VALUE (parmtypes); @@ -4285,6 +4286,7 @@ lookup_literal_operator (tree name, vec<tree, va_gc> *args) TREE_TYPE (targ)))) found = false; } + if (found && ix == vec_safe_length (args) /* May be this should be sufficient_parms_p instead, @@ -4292,7 +4294,11 @@ lookup_literal_operator (tree name, vec<tree, va_gc> *args) work in presence of default arguments on the literal operator parameters. */ && parmtypes == void_list_node) - return decl; + { + if (processing_template_decl) + lookup_keep (decl); + return decl; + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index abddcdf..b1b6ae4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-11-16 Nathan Sidwell <nathan@acm.org> + + PR c++/87269 + * g++.dg/lookup/pr87269.C: New. + 2018-11-16 Richard Biener <rguenther@suse.de> PR testsuite/88053 diff --git a/gcc/testsuite/g++.dg/lookup/pr87269.C b/gcc/testsuite/g++.dg/lookup/pr87269.C new file mode 100644 index 0000000..b0ceda2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr87269.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +// PR c++/87269 ICE failing to keep a lookup + +namespace { + void operator"" _a (const char *, unsigned long) {} +} + +void operator"" _a (unsigned long long); + +template <typename> void f () { ""_a; } + +void frob () +{ + f<int> (); +} |