aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/template/access11.C24
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" }