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:
parent
c7684ffe55
commit
b7fc8b576e
@ -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>
|
2003-05-23 Geoffrey Keating <geoffk@apple.com>
|
||||||
|
|
||||||
* lang-specs.h: Use -o to specify preprocessor's output file.
|
* lang-specs.h: Use -o to specify preprocessor's output file.
|
||||||
|
@ -8318,6 +8318,9 @@ cp_parser_explicit_instantiation (cp_parser* parser)
|
|||||||
tree type;
|
tree type;
|
||||||
|
|
||||||
type = check_tag_decl (decl_specifiers);
|
type = check_tag_decl (decl_specifiers);
|
||||||
|
/* Turn access control back on for names used during
|
||||||
|
template instantiation. */
|
||||||
|
pop_deferring_access_checks ();
|
||||||
if (type)
|
if (type)
|
||||||
do_type_instantiation (type, extension_specifier, /*complain=*/1);
|
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);
|
/*ctor_dtor_or_conv_p=*/NULL);
|
||||||
decl = grokdeclarator (declarator, decl_specifiers,
|
decl = grokdeclarator (declarator, decl_specifiers,
|
||||||
NORMAL, 0, NULL);
|
NORMAL, 0, NULL);
|
||||||
|
/* Turn access control back on for names used during
|
||||||
|
template instantiation. */
|
||||||
|
pop_deferring_access_checks ();
|
||||||
/* Do the explicit instantiation. */
|
/* Do the explicit instantiation. */
|
||||||
do_decl_instantiation (decl, extension_specifier);
|
do_decl_instantiation (decl, extension_specifier);
|
||||||
}
|
}
|
||||||
/* We're done with the instantiation. */
|
/* We're done with the instantiation. */
|
||||||
end_explicit_instantiation ();
|
end_explicit_instantiation ();
|
||||||
/* Turn access control back on. */
|
|
||||||
pop_deferring_access_checks ();
|
|
||||||
|
|
||||||
cp_parser_consume_semicolon_at_end_of_statement (parser);
|
cp_parser_consume_semicolon_at_end_of_statement (parser);
|
||||||
}
|
}
|
||||||
|
@ -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>
|
2003-05-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||||
|
|
||||||
PR c++/10849
|
PR c++/10849
|
||||||
|
24
gcc/testsuite/g++.dg/template/access11.C
Normal file
24
gcc/testsuite/g++.dg/template/access11.C
Normal 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" }
|
Loading…
Reference in New Issue
Block a user