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
This commit is contained in:
Kriang Lerdsuwanakij 2003-05-25 12:59:22 +00:00 committed by Kriang Lerdsuwanakij
parent c7684ffe55
commit b7fc8b576e
4 changed files with 39 additions and 2 deletions

View File

@ -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.

View File

@ -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);
}

View File

@ -1,3 +1,7 @@
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

View File

@ -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" }