[PR c++/87269] Mark string operator overload in template defn.
authorNathan Sidwell <nathan@acm.org>
Fri, 16 Nov 2018 15:01:55 +0000 (15:01 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 16 Nov 2018 15:01:55 +0000 (15:01 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/pr87269.C [new file with mode: 0644]

index deec822b924f87e198694390be7ec6f6f3c41053..6b167f33e06e5f0c858ec273c86f608bc8dcc4e2 100644 (file)
@@ -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
index 8833e3db746aab408acde2c8d7b258a65f6d0311..99bd4dc08fbed4cd8b6ee344dcfeaedf3522e6cf 100644 (file)
@@ -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;
+           }
        }
     }
 
index abddcdf2e6df954274fd78c890b6b19cb7d5b671..b1b6ae4bc8706c261700989bd8946f094483fce9 100644 (file)
@@ -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 (file)
index 0000000..b0ceda2
--- /dev/null
@@ -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> ();
+}