From 9f01ded6a4ccb23faa18ce19091eb5ea0408b8d9 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sun, 11 May 2003 10:06:39 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 13 +++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/scoped5.C | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/scoped5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9aa822b8cef..a11a50218b3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-05-11 Kriang Lerdsuwanakij + + 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 PR c++/10552 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 62a900a95b5..ab6a75c7ddb 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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' diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ade25071722..5f370555bf4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-05-11 Kriang Lerdsuwanakij + + PR c++/10230, c++/10481 + * g++.dg/lookup/scoped5.C: New test. + 2003-05-11 Kriang Lerdsuwanakij PR c++/10552 diff --git a/gcc/testsuite/g++.dg/lookup/scoped5.C b/gcc/testsuite/g++.dg/lookup/scoped5.C new file mode 100644 index 00000000000..267bc601d38 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped5.C @@ -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" } +}; -- 2.30.2