re PR c++/5123 (tree check: expected identifier_node, have template_id_expr in build_...
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 2 Jan 2002 12:47:26 +0000 (12:47 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 2 Jan 2002 12:47:26 +0000 (12:47 +0000)
cp:
PR c++/5123
* typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR.
(build_x_function_call): Cope with a COMPONENT_REF containing a
TEMPLATE_ID_EXPR.
testsuite:
* g++.dg/other/component1.C: New test.

From-SVN: r48469

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/component1.C [new file with mode: 0644]

index 145f5be..ef4c0dd 100644 (file)
@@ -1,5 +1,12 @@
 2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
 
+       PR c++/5123
+       * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR.
+       (build_x_function_call): Cope with a COMPONENT_REF containing a
+       TEMPLATE_ID_EXPR.
+
+2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
+
        PR c++/5213
        * pt.c (convert_template_argument): Be more careful determining
        when RECORD_TYPE templates are or are not templates.
index 9fdd168..b939de7 100644 (file)
@@ -2030,7 +2030,7 @@ build_component_ref (datum, component, basetype_path, protect)
                              basetype_path, protect));
 
     case TEMPLATE_DECL:
-      error ("invalid use of %D", datum);
+      error ("invalid use of `%D'", datum);
       datum = error_mark_node;
       break;
 
@@ -2114,7 +2114,10 @@ build_component_ref (datum, component, basetype_path, protect)
   else
     {
       tree name = component;
-      if (TREE_CODE (component) == VAR_DECL)
+      
+      if (TREE_CODE (component) == TEMPLATE_ID_EXPR)
+       name = TREE_OPERAND (component, 0);
+      else if (TREE_CODE (component) == VAR_DECL)
        name = DECL_NAME (component);
       if (TREE_CODE (component) == NAMESPACE_DECL)
         /* Source is in error, but produce a sensible diagnostic.  */
@@ -2162,8 +2165,14 @@ build_component_ref (datum, component, basetype_path, protect)
                    }
                }
 
+             fndecls = TREE_VALUE (fndecls);
+             
+             if (TREE_CODE (component) == TEMPLATE_ID_EXPR)
+               fndecls = build_nt (TEMPLATE_ID_EXPR,
+                                   fndecls, TREE_OPERAND (component, 1));
+             
              ref = build (COMPONENT_REF, unknown_type_node,
-                          datum, TREE_VALUE (fndecls));
+                          datum, fndecls);
              return ref;
            }
 
@@ -2699,12 +2708,22 @@ build_x_function_call (function, params, decl)
       /* Undo what we did in build_component_ref.  */
       decl = TREE_OPERAND (function, 0);
       function = TREE_OPERAND (function, 1);
-      function = DECL_NAME (OVL_CURRENT (function));
 
-      if (template_id)
+      if (TREE_CODE (function) == TEMPLATE_ID_EXPR)
+       {
+         my_friendly_assert (!template_id, 20011228);
+
+         template_id = function;
+       }
+      else
        {
-         TREE_OPERAND (template_id, 0) = function;
-         function = template_id;
+         function = DECL_NAME (OVL_CURRENT (function));
+
+         if (template_id)
+           {
+             TREE_OPERAND (template_id, 0) = function;
+             function = template_id;
+           }
        }
 
       return build_method_call (decl, function, params,
index fc18102..dac37bd 100644 (file)
@@ -1,5 +1,7 @@
 2002-01-02  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * g++.dg/other/component1.C: New test.
+
        * g++.dg/template/ttp3.C: New test.
 
        * g++.dg/template/friend2.C: New test.
diff --git a/gcc/testsuite/g++.dg/other/component1.C b/gcc/testsuite/g++.dg/other/component1.C
new file mode 100644 (file)
index 0000000..3041a23
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com>
+
+// PR 5123. ICE
+
+struct C {
+  template<class T> void f(T);
+  void g ();
+  void g (int);
+};
+
+void Foo () {
+  C c;
+
+  (c.g) ();
+  (c.f) (1);
+  
+  (c.f<int>) (2);
+
+  c.g;                 // { dg-error "statement cannot resolve" "" }
+  c.f;                 // { dg-error "statement cannot resolve" "" }
+  c.f<int>;            // { dg-error "statement cannot resolve" "" }
+  
+  c.g == 1;            // { dg-error "invalid use of" "" }
+  c.f == 1;            // { dg-error "invalid use of" "" }
+  c.f<int> == 1;       // { dg-error "invalid use of" "" }
+};