diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-10-26 11:04:36 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-10-26 11:04:36 +0000 |
commit | 58e1d54ce9d6a263d48ef9bee5bed78b24b9b275 (patch) | |
tree | 8e21ee6bbaba55a5c6f316a087711cbdb883c900 | |
parent | f883c8dce3c9c7330faf0d533a796475f51c89fa (diff) | |
download | gcc-58e1d54ce9d6a263d48ef9bee5bed78b24b9b275.zip gcc-58e1d54ce9d6a263d48ef9bee5bed78b24b9b275.tar.gz gcc-58e1d54ce9d6a263d48ef9bee5bed78b24b9b275.tar.bz2 |
re PR c++/10371 (misleading error message for illegal member access)
PR c++/10371
* semantics.c (finish_non_static_data_member): Handle when
both processing_template_decl and qualifying_scope are true.
* g++.dg/lookup/scoped8.C: New test.
From-SVN: r72950
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/scoped8.C | 16 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0d1cd91..0b7e809 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-10-26 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/10371 + * semantics.c (finish_non_static_data_member): Handle when + both processing_template_decl and qualifying_scope are true. + 2003-10-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> PR c++/11076 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index b55059d..13d8734 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1224,7 +1224,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) return error_mark_node; } TREE_USED (current_class_ptr) = 1; - if (processing_template_decl) + if (processing_template_decl && !qualifying_scope) { tree type = TREE_TYPE (decl); @@ -1263,6 +1263,13 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) } } + /* If PROCESSING_TEMPLATE_DECL is non-zero here, then + QUALIFYING_SCOPE is also non-null. Wrap this in a SCOPE_REF + for now. */ + if (processing_template_decl) + return build_min (SCOPE_REF, TREE_TYPE (decl), + qualifying_scope, DECL_NAME (decl)); + perform_or_defer_access_check (TYPE_BINFO (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 28a067b..47a7512 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-10-26 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/10371 + * g++.dg/lookup/scoped8.C: New test. + 2003-10-25 Eric Botcazou <ebotcazou@libertysurf.fr> * g++.dg/opt/reg-stack3.C: New test. diff --git a/gcc/testsuite/g++.dg/lookup/scoped8.C b/gcc/testsuite/g++.dg/lookup/scoped8.C new file mode 100644 index 0000000..1c30304 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped8.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10371: Incorrect tree node built in +// finish_non_static_data_member. + +struct A +{ + int i; // { dg-error "object missing" } +}; + +template <int> struct B +{ + int foo() { return A::i; } // { dg-error "this location" } +}; |