decl2.c (build_expr_from_tree): Handle COMPONENT_REFs that indicate a reference to...
authorMark Mitchell <mark@codesourcery.com>
Sun, 16 May 1999 23:46:40 +0000 (23:46 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 16 May 1999 23:46:40 +0000 (23:46 +0000)
* decl2.c (build_expr_from_tree): Handle COMPONENT_REFs that
indicate a reference to a field that is a qualified name.

From-SVN: r26956

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/g++.old-deja/g++.pt/lookup9.C [new file with mode: 0644]

index 6f1ac55818ab07fa797d278a5409761c7ae8844c..51479528fd9cb7bb430c60f944ab8dbd1ef06b19 100644 (file)
@@ -1,3 +1,8 @@
+1999-05-16  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl2.c (build_expr_from_tree): Handle COMPONENT_REFs that
+       indicate a reference to a field that is a qualified name.
+
 1999-05-16  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl2.c (finish_objects): Don't use .?tors.* if we don't have
index 6a7e14f7a25f0b057ee377122ab0768dd705eb30..bb24014d790c4b12ec23f9c39959933726ed77b9 100644 (file)
@@ -4056,10 +4056,22 @@ build_expr_from_tree (t)
       }
 
     case COMPONENT_REF:
-      return build_x_component_ref
-       (build_expr_from_tree (TREE_OPERAND (t, 0)),
-        TREE_OPERAND (t, 1), NULL_TREE, 1);
-      
+      {
+       tree object = build_expr_from_tree (TREE_OPERAND (t, 0));
+       tree field = TREE_OPERAND (t, 1);
+       
+       /* We use a COMPONENT_REF to indicate things of the form `x.b'
+          and `x.A::b'.  We must distinguish between those cases
+          here.  */
+       if (TREE_CODE (field) == SCOPE_REF)
+         return build_object_ref (object, 
+                                  TREE_OPERAND (field, 0),
+                                  TREE_OPERAND (field, 1));
+       else
+         return build_x_component_ref (object, field,
+                                       NULL_TREE, 1);
+      }
+
     case THROW_EXPR:
       return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0)));
 
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/lookup9.C b/gcc/testsuite/g++.old-deja/g++.pt/lookup9.C
new file mode 100644 (file)
index 0000000..d81ffb6
--- /dev/null
@@ -0,0 +1,16 @@
+// Build don't link:
+// Origin: "Artem Hodyush" <artem@duma.gov.ru>
+
+struct B { int m; };
+
+template< class T >
+void
+q( T& t ) {
+  t.T::m=1;
+}
+
+void f() {
+  B b;
+  b.B::m=1;
+  q( b );
+}