From: Jason Merrill Date: Thu, 12 Jul 2012 22:57:16 +0000 (-0400) Subject: pt.c (instantiate_decl): Check typedefs access here. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b52259e162427d7ebb8205bd72b94bd093216f62;p=gcc.git pt.c (instantiate_decl): Check typedefs access here. * pt.c (instantiate_decl): Check typedefs access here. (instantiate_template_1): Not here. From-SVN: r189444 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 299116b81fa..c5f23123276 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2012-07-12 Jason Merrill + * pt.c (instantiate_decl): Check typedefs access here. + (instantiate_template_1): Not here. + * pt.c (deduction_tsubst_fntype): Just suppress access checking. (instantiate_template_1): Set DECL_TI_TEMPLATE before access checking. (push_deduction_access_scope, pop_deduction_access_scope): Remove. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fec88eb4a34..95c6464e61b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8334,7 +8334,7 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, /* Perform (or defer) access check for typedefs that were referenced from within the template TMPL code. - This is a subroutine of instantiate_template and instantiate_class_template. + This is a subroutine of instantiate_decl and instantiate_class_template. TMPL is the template to consider and TARGS is the list of arguments of that template. */ @@ -14380,12 +14380,6 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) /* Now we know the specialization, compute access previously deferred. */ push_access_scope (fndecl); - - /* Some typedefs referenced from within the template code need to be access - checked at template instantiation time, i.e now. These types were - added to the template at parsing time. Let's get those and perfom - the acces checks then. */ - perform_typedefs_access_check (DECL_TEMPLATE_RESULT (tmpl), targ_ptr); perform_deferred_access_checks (); pop_access_scope (fndecl); pop_deferring_access_checks (); @@ -18395,6 +18389,13 @@ instantiate_decl (tree d, int defer_ok, /* Set up context. */ start_preparsed_function (d, NULL_TREE, SF_PRE_PARSED); + /* Some typedefs referenced from within the template code need to be + access checked at template instantiation time, i.e now. These + types were added to the template at parsing time. Let's get those + and perform the access checks then. */ + perform_typedefs_access_check (DECL_TEMPLATE_RESULT (gen_tmpl), + gen_args); + /* Create substitution entries for the parameters. */ subst_decl = DECL_TEMPLATE_RESULT (template_for_substitution (d)); tmpl_parm = DECL_ARGUMENTS (subst_decl); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 0cacf749479..a32e48aa049 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1625,7 +1625,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) /* If we are currently parsing a template and we encountered a typedef TYPEDEF_DECL that is being accessed though CONTEXT, this function adds the typedef to a list tied to the current template. - At tempate instantiatin time, that list is walked and access check + At template instantiation time, that list is walked and access check performed for each typedef. LOCATION is the location of the usage point of TYPEDEF_DECL. */ diff --git a/gcc/testsuite/g++.dg/template/typedef11.C b/gcc/testsuite/g++.dg/template/typedef11.C index c7c7c989f72..a08d7b3a939 100644 --- a/gcc/testsuite/g++.dg/template/typedef11.C +++ b/gcc/testsuite/g++.dg/template/typedef11.C @@ -18,8 +18,8 @@ template int bar () { - Beta<0>::Y i = 0; - return Alpha::X (); + Beta<0>::Y i = 0; // { dg-error "within this context" } + return Alpha::X (); // { dg-error "within this context" } } -int i = bar<0> (); // { dg-error "within this context" } +int i = bar<0> ();