From db8470f688f2f2f8ac3be4a971961b76aff7909b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Jan 2009 17:36:11 -0500 Subject: [PATCH] re PR c++/29470 (Using declaration access semantics change with templates) PR c++/29470 * pt.c (tsubst_decl) [USING_DECL]: Propagate access flags. From-SVN: r143445 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 5 +++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/template/access20.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/torture/pr34641.C | 1 + 5 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/access20.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 395873ced6b9..ff0de5900996 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2009-01-16 Jason Merrill + PR c++/29470 + * pt.c (tsubst_decl) [USING_DECL]: Propagate access flags. + PR c++/38579 * search.c (protected_accessible_p): N doesn't vary. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 0378d39be123..f6809f2bdf7d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8485,6 +8485,11 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) tsubst_copy (DECL_NAME (t), args, complain, in_decl)); if (!r) r = error_mark_node; + else + { + TREE_PROTECTED (r) = TREE_PROTECTED (t); + TREE_PRIVATE (r) = TREE_PRIVATE (t); + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7084b7e8507..69660e789e6a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-01-16 Jason Merrill + + PR c++/29470 + * g++.dg/template/access20.C: New test. + * g++.dg/torture/pr34641.C: Fix access. + 2009-01-16 Richard Guenther PR tree-optimization/38835 diff --git a/gcc/testsuite/g++.dg/template/access20.C b/gcc/testsuite/g++.dg/template/access20.C new file mode 100644 index 000000000000..ebf575e6c30a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access20.C @@ -0,0 +1,18 @@ +// PR c++/29470 + +template struct B +{ + protected: + T v; // { dg-error "protected" } +}; +template struct D : B +{ + protected: + using B::v; +}; +int main() +{ + D d; + d.v = 0; // { dg-error "context" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr34641.C b/gcc/testsuite/g++.dg/torture/pr34641.C index 9e4f2662e784..0cf507762811 100644 --- a/gcc/testsuite/g++.dg/torture/pr34641.C +++ b/gcc/testsuite/g++.dg/torture/pr34641.C @@ -70,6 +70,7 @@ template < typename T, size_t inlineCapacity > class VectorBuffer; template < typename T > class VectorBuffer < T, 0 >:private VectorBufferBase < T > { +public: typedef VectorBufferBase < T > Base; using Base::allocateBuffer; }; -- 2.47.3