OSDN Git Service

PR c++/12924
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Nov 2003 11:32:14 +0000 (11:32 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Nov 2003 11:32:14 +0000 (11:32 +0000)
* typeck.c (finish_class_member_access_expr): Handle TEMPLATE_ID_EXPR
with OVERLOAD and DECL nodes as the first operand.

* g++.dg/template/template-id-2.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73851 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/template-id-2.C [new file with mode: 0644]

index 1ec5f1f..a6d4223 100644 (file)
@@ -1,3 +1,9 @@
+2003-11-23  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/12924
+       * typeck.c (finish_class_member_access_expr): Handle TEMPLATE_ID_EXPR
+       with OVERLOAD and DECL nodes as the first operand.
+
 2003-11-22  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        * pt.c (tsubst) <ARRAY_REF>: Remove erroneous argument to build_nt.
index fa325c0..f2cca5f 100644 (file)
@@ -1860,6 +1860,11 @@ finish_class_member_access_expr (tree object, tree name)
          is_template_id = true;
          template_args = TREE_OPERAND (name, 1);
          name = TREE_OPERAND (name, 0);
+
+         if (TREE_CODE (name) == OVERLOAD)
+           name = DECL_NAME (get_first_fn (name));
+         else if (DECL_P (name))
+           name = DECL_NAME (name);
        }
 
       if (TREE_CODE (name) == SCOPE_REF)
index c339a0d..592508b 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-23  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/12924
+       * g++.dg/template/template-id-2.C: New test.
+
 2003-11-22  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/5369
diff --git a/gcc/testsuite/g++.dg/template/template-id-2.C b/gcc/testsuite/g++.dg/template/template-id-2.C
new file mode 100644 (file)
index 0000000..1bc378c
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
+
+// PR c++/12924
+
+template<typename> struct A {};
+
+template<> struct A<void>
+{
+    template<typename T> void foo()
+    {
+        A<T> a;
+        a.template foo<int>(); // { dg-error "no member" }
+    }
+};
+
+void bar()
+{
+    A<void> a;
+    a.foo<int>();              // { dg-error "instantiated" }
+}