diff options
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/scoped8.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/inherit4.C | 14 |
5 files changed, 32 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1ffa86a..b148d23 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-11-13 Jason Merrill <jason@redhat.com> + PR c++/21008, DR 515 + * semantics.c (finish_non_static_data_member): Don't check + derivation in a template. + PR c++/11987 * parser.c (cp_parser_direct_declarator): Give helpful error about trying to define member of a dependent typedef. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e270a73..c1df24b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1485,6 +1485,14 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) return build_min (COMPONENT_REF, type, object, decl, NULL_TREE); } + /* If PROCESSING_TEMPLATE_DECL is nonzero here, then + QUALIFYING_SCOPE is also non-null. Wrap this in a SCOPE_REF + for now. */ + else if (processing_template_decl) + return build_qualified_name (TREE_TYPE (decl), + qualifying_scope, + DECL_NAME (decl), + /*template_p=*/false); else { tree access_type = TREE_TYPE (object); @@ -1504,15 +1512,6 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) } } - /* If PROCESSING_TEMPLATE_DECL is nonzero here, then - QUALIFYING_SCOPE is also non-null. Wrap this in a SCOPE_REF - for now. */ - if (processing_template_decl) - return build_qualified_name (TREE_TYPE (decl), - qualifying_scope, - DECL_NAME (decl), - /*template_p=*/false); - perform_or_defer_access_check (TYPE_BINFO (access_type), decl, decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 20f4686b..82752b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2009-11-13 Jason Merrill <jason@redhat.com> + PR c++/21008, DR 515 + * g++.dg/template/inherit4.C: New. + * g++.dg/lookup/scoped8.C: Adjust. + PR c++/11987 * g++.dg/parse/typename11.C: New. * g++.dg/template/crash48.C: Adjust. diff --git a/gcc/testsuite/g++.dg/lookup/scoped8.C b/gcc/testsuite/g++.dg/lookup/scoped8.C index 1c30304..2ba28a6 100644 --- a/gcc/testsuite/g++.dg/lookup/scoped8.C +++ b/gcc/testsuite/g++.dg/lookup/scoped8.C @@ -14,3 +14,5 @@ template <int> struct B { int foo() { return A::i; } // { dg-error "this location" } }; + +template struct B<0>; diff --git a/gcc/testsuite/g++.dg/template/inherit4.C b/gcc/testsuite/g++.dg/template/inherit4.C new file mode 100644 index 0000000..511c9e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit4.C @@ -0,0 +1,14 @@ +// PR c++/21008, DR 515 + +struct A { + int foo_; +}; +template <typename T> struct B: public A { }; +template <typename T> struct C: B<T> { + int foo() { + return A::foo_; // #1 + } +}; +int f(C<int>* p) { + return p->foo(); +} |