[PR c++/86374] Name lookup failure in enclosing template
authorNathan Sidwell <nathan@acm.org>
Fri, 13 Jul 2018 15:33:27 +0000 (15:33 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 13 Jul 2018 15:33:27 +0000 (15:33 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-07/msg00701.html
PR c++/86374
* pt.c (lookup_template_class_1): Use tsubst_aggr_type for
contexts that are classes.
* parser.c (cp_parser_template_id): Combine entering_scope decl &
initializer.

PR c++/86374
* g++.dg/pr86374.C: New.

From-SVN: r262637

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

index a640259193c26bab3f9dc1c71d03265ae3693e60..1d5d66946f61cbd80333fc90882b0b231c911899 100644 (file)
@@ -1,3 +1,11 @@
+2018-07-13  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/86374
+       * pt.c (lookup_template_class_1): Use tsubst_aggr_type for
+       contexts that are classes.
+       * parser.c (cp_parser_template_id): Combine entering_scope decl &
+       initializer.
+
 2018-07-12  Jakub Jelinek  <jakub@redhat.com>
 
        * decl2.c (cplus_decl_attributes): Don't diagnose vars without mappable
index 366a0d894602db5f74ed89cf2e94938eb88fed57..d0f1e1e97014ffaad3c04b87e57a5d1f79ce22d3 100644 (file)
@@ -15973,15 +15973,14 @@ cp_parser_template_id (cp_parser *parser,
   else if (DECL_TYPE_TEMPLATE_P (templ)
           || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
     {
-      bool entering_scope;
       /* In "template <typename T> ... A<T>::", A<T> is the abstract A
         template (rather than some instantiation thereof) only if
         is not nested within some other construct.  For example, in
         "template <typename T> void f(T) { A<T>::", A<T> is just an
         instantiation of A.  */
-      entering_scope = (template_parm_scope_p ()
-                       && cp_lexer_next_token_is (parser->lexer,
-                                                  CPP_SCOPE));
+      bool entering_scope
+       = (template_parm_scope_p ()
+          && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE));
       template_id
        = finish_template_type (templ, arguments, entering_scope);
     }
index eae9e14d37d0bf302d60142025d9d01dbda3c7bd..9de9f500e2a81a4b840144d6c3babdc42ac00e78 100644 (file)
@@ -9368,8 +9368,15 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
          return found;
        }
 
-      context = tsubst (DECL_CONTEXT (gen_tmpl), arglist,
-                       complain, in_decl);
+      context = DECL_CONTEXT (gen_tmpl);
+      if (context && TYPE_P (context))
+       {
+         context = tsubst_aggr_type (context, arglist, complain, in_decl, true);
+         context = complete_type (context);
+       }
+      else
+       context = tsubst (context, arglist, complain, in_decl);
+
       if (context == error_mark_node)
        return error_mark_node;
 
index 0c61e976f736464ce3931cbed9e61255daec5cc2..1780ca0074ae0d60d6d97be2f74c13fc83f2e063 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-13  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/86374
+       * g++.dg/pr86374.C: New.
+
 2018-07-13  Qing Zhao  <qing.zhao@oracle.com>
 
        PR middle-end/78809
diff --git a/gcc/testsuite/g++.dg/pr86374.C b/gcc/testsuite/g++.dg/pr86374.C
new file mode 100644 (file)
index 0000000..fd71156
--- /dev/null
@@ -0,0 +1,20 @@
+// pr C++/86374
+// bogus lookup error
+template<typename LIST>
+struct list {
+  static const int index = 1;
+  template <typename> struct addWithChecking {};
+};
+
+template<typename container, int ix = container::index>
+struct find {
+  static const int result = 0;
+};
+
+template <class LIST>
+template<class O>
+struct list<LIST>::addWithChecking<O*>
+{
+  static const int xres =
+    find<list<LIST> >::result; // bogus error about index here.
+};