diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-05-25 12:59:22 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-05-25 12:59:22 +0000 |
commit | b7fc8b576e9aafd37dcc8e78a87372eb8eae011b (patch) | |
tree | b4fe5fbb56771ed361b7bb1fd800cb8a22806330 /gcc | |
parent | c7684ffe55c75b893fe40988dbb8fcea9beae3ba (diff) | |
download | gcc-b7fc8b576e9aafd37dcc8e78a87372eb8eae011b.zip gcc-b7fc8b576e9aafd37dcc8e78a87372eb8eae011b.tar.gz gcc-b7fc8b576e9aafd37dcc8e78a87372eb8eae011b.tar.bz2 |
parser.c (cp_parser_explicit_instantiation): Restore old access before template instantiation.
* parser.c (cp_parser_explicit_instantiation): Restore old
access before template instantiation.
* g++.dg/template/access11.C: New test.
From-SVN: r67166
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/access11.C | 24 |
4 files changed, 39 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 98f4f71..33fcb14 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2003-05-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + * parser.c (cp_parser_explicit_instantiation): Restore old + access before template instantiation. + 2003-05-23 Geoffrey Keating <geoffk@apple.com> * lang-specs.h: Use -o to specify preprocessor's output file. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index cf768e0..19172f0 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8318,6 +8318,9 @@ cp_parser_explicit_instantiation (cp_parser* parser) tree type; type = check_tag_decl (decl_specifiers); + /* Turn access control back on for names used during + template instantiation. */ + pop_deferring_access_checks (); if (type) do_type_instantiation (type, extension_specifier, /*complain=*/1); } @@ -8332,13 +8335,14 @@ cp_parser_explicit_instantiation (cp_parser* parser) /*ctor_dtor_or_conv_p=*/NULL); decl = grokdeclarator (declarator, decl_specifiers, NORMAL, 0, NULL); + /* Turn access control back on for names used during + template instantiation. */ + pop_deferring_access_checks (); /* Do the explicit instantiation. */ do_decl_instantiation (decl, extension_specifier); } /* We're done with the instantiation. */ end_explicit_instantiation (); - /* Turn access control back on. */ - pop_deferring_access_checks (); cp_parser_consume_semicolon_at_end_of_statement (parser); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 37b37b4..b670e7d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2003-05-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + * g++.dg/template/access11.C: New test. + +2003-05-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + PR c++/10849 * g++.dg/template/access10.C: New test. diff --git a/gcc/testsuite/g++.dg/template/access11.C b/gcc/testsuite/g++.dg/template/access11.C new file mode 100644 index 0000000..f061f66 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access11.C @@ -0,0 +1,24 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Access checking during explicit instantiation. + +class A { + typedef int X; // { dg-error "private" } +}; + +class X { + private: + template <typename T> struct Y; +}; + +template <> struct X::Y<int> { + A::X x; // { dg-error "this context" } +}; + +template <typename T> struct X::Y { + typename T::X x; // { dg-error "this context" } +}; + +template struct X::Y<A>; // { dg-error "instantiated" } |