diff options
| -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 0d1cd9173ad..0b7e80975b9 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 b55059dbc64..13d873430ea 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 28a067b1a6d..47a7512c64f 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 00000000000..1c303045608 --- /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" } +}; |

