+2003-05-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/10230, c++/10481
+ * semantics.c (finish_non_static_data_member): Handle when the
+ non-static member is not from a base of the current class type.
+
2003-05-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/10552
tree access_type = current_class_type;
tree object = current_class_ref;
- while (!DERIVED_FROM_P (context_for_name_lookup (decl), access_type))
+ while (access_type
+ && !DERIVED_FROM_P (context_for_name_lookup (decl), access_type))
{
access_type = TYPE_CONTEXT (access_type);
- while (DECL_P (access_type))
+ while (access_type && DECL_P (access_type))
access_type = DECL_CONTEXT (access_type);
}
+ if (!access_type)
+ {
+ cp_error_at ("object missing in reference to `%D'",
+ decl);
+ error ("from this location");
+ return error_mark_node;
+ }
+
perform_or_defer_access_check (access_type, decl);
/* If the data member was named `C::M', convert `*this' to `C'
+2003-05-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/10230, c++/10481
+ * g++.dg/lookup/scoped5.C: New test.
+
2003-05-11 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/10552
--- /dev/null
+// { dg-do compile }
+
+// Origin: pepeaty@yahoo.com
+
+// PR c++/10230: ICE while determining if refered non-static member
+// is from a base type of the current class.
+
+class A {
+public:
+ class B {
+ public:
+ int a; // { dg-error "member of base" }
+ };
+};
+
+class C {
+public:
+ void f(void) { sizeof(A::B::a); } // { dg-error "this location" }
+};