PR c++/10230, c++/10481
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. * g++.dg/lookup/scoped5.C: New test. From-SVN: r66683
This commit is contained in:
parent
fcea74011f
commit
9f01ded6a4
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -1276,13 +1276,22 @@ finish_non_static_data_member (tree decl, tree qualifying_scope)
|
|||
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'
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// { 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" }
|
||||
};
|
Loading…
Reference in New Issue