PR c++/85731 - wrong error with qualified-id in template.
authorJason Merrill <jason@redhat.com>
Tue, 5 Jun 2018 11:27:12 +0000 (07:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 5 Jun 2018 11:27:12 +0000 (07:27 -0400)
* semantics.c (finish_qualified_id_expr): build_qualified_name
for unbound names in the current class.

From-SVN: r261196

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/template/qualified-id7.C [new file with mode: 0644]

index c07371ee3a6b3c670e400d8d65e9ff9069c4afeb..f4fa21a7a9782422926d9bb3954825edab4a750a 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/85731 - wrong error with qualified-id in template.
+       * semantics.c (finish_qualified_id_expr): build_qualified_name
+       for unbound names in the current class.
+
 2018-06-04  Jason Merrill  <jason@redhat.com>
 
        PR c++/61806 - missed SFINAE with partial specialization.
index e00331a3ea4a6c1aa1979f7ecaa08798f93cb56b..a3426623385dbcdd18499f1316f11b6d5c342e46 100644 (file)
@@ -2098,6 +2098,8 @@ finish_qualified_id_expr (tree qualifying_class,
         non-type template argument handling.  */
       if (processing_template_decl
          && (!currently_open_class (qualifying_class)
+             || TREE_CODE (expr) == IDENTIFIER_NODE
+             || TREE_CODE (expr) == TEMPLATE_ID_EXPR
              || TREE_CODE (expr) == BIT_NOT_EXPR))
        expr = build_qualified_name (TREE_TYPE (expr),
                                     qualifying_class, expr,
diff --git a/gcc/testsuite/g++.dg/template/qualified-id7.C b/gcc/testsuite/g++.dg/template/qualified-id7.C
new file mode 100644 (file)
index 0000000..fd952f6
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/85731
+// { dg-do compile { target c++11 } }
+
+    template <typename T>
+    struct Outer {
+        struct Inner;
+        template <int I> static void f();
+    };
+
+    template <typename T>
+    struct Outer<T>::Inner {
+        decltype(Outer<T>::f<42>()) f();
+    };
+
+    int main() { Outer<int>::Inner().f(); }