aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-10-26 11:04:36 +0000
committerKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-10-26 11:04:36 +0000
commit9ac72abe936b072841507e81e0b382c8380a2ac4 (patch)
tree8e21ee6bbaba55a5c6f316a087711cbdb883c900
parent2e9f59ef3f39fa248fcfbb40fca722e59346ac84 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@72950 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/scoped8.C16
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" }
+};