init.c (build_offset_ref): Deal with namespace scoped TEMPLATE_ID_EXPRs.
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 6 Sep 2000 09:04:00 +0000 (09:04 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 6 Sep 2000 09:04:00 +0000 (09:04 +0000)
* init.c (build_offset_ref): Deal with namespace scoped
TEMPLATE_ID_EXPRs.

From-SVN: r36189

gcc/cp/ChangeLog
gcc/cp/init.c

index 744511a..e5c11ef 100644 (file)
@@ -1,5 +1,10 @@
 2000-09-06  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * init.c (build_offset_ref): Deal with namespace scoped
+       TEMPLATE_ID_EXPRs.
+
+2000-09-06  Nathan Sidwell  <nathan@codesourcery.com>
+
        * class.c (resolve_address_of_overloaded_function): Add
        explanation message.
        * decl.c (define_case_label): Reformat explanation.
index 7d1e3b4..68f92b6 100644 (file)
@@ -1624,21 +1624,6 @@ build_offset_ref (type, name)
   if (processing_template_decl || uses_template_parms (type))
     return build_min_nt (SCOPE_REF, type, name);
 
-  /* Handle namespace names fully here.  */
-  if (TREE_CODE (type) == NAMESPACE_DECL)
-    {
-      t = lookup_namespace_name (type, name);
-      if (t != error_mark_node && ! type_unknown_p (t))
-       {
-         mark_used (t);
-         t = convert_from_reference (t);
-       }
-      return t;
-    }
-
-  if (type == NULL_TREE || ! is_aggr_type (type, 1))
-    return error_mark_node;
-
   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
     {
       /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at
@@ -1666,6 +1651,30 @@ build_offset_ref (type, name)
       my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0);
     }
 
+  if (type == NULL_TREE)
+    return error_mark_node;
+  
+  /* Handle namespace names fully here.  */
+  if (TREE_CODE (type) == NAMESPACE_DECL)
+    {
+      t = lookup_namespace_name (type, name);
+      if (t == error_mark_node)
+        return t;
+      if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
+        /* Reconstruct the TEMPLATE_ID_EXPR.  */
+        t = build (TEMPLATE_ID_EXPR, TREE_TYPE (t),
+                   t, TREE_OPERAND (orig_name, 1));
+      if (! type_unknown_p (t))
+       {
+         mark_used (t);
+         t = convert_from_reference (t);
+       }
+      return t;
+    }
+
+  if (! is_aggr_type (type, 1))
+    return error_mark_node;
+
   if (TREE_CODE (name) == BIT_NOT_EXPR)
     {
       if (! check_dtor_name (type, name))