diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 744511a0982d22357191b2d58dfed61e0352cc4e..e5c11eff83f75c00103aa3699435e73f6d605bc6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 7d1e3b4b546243daddca2c3b343f16d86c6ab64a..68f92b6835b24655ecea6592b0ffd695eb4044d3 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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))