]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/51213 (again)
authorJason Merrill <jason@redhat.com>
Thu, 2 Aug 2012 18:44:58 +0000 (14:44 -0400)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 2 Aug 2012 18:44:58 +0000 (18:44 +0000)
/cp
2012-08-02  Jason Merrill  <jason@redhat.com>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51213 (again)
* pt.c (type_unification_real): Call push_deferring_access_checks /
pop_deferring_access_checks around the substitution of default
template args.
(instantiate_template_1): When the specialization returned by
retrieve_specialization has FNDECL_HAS_ACCESS_ERRORS set and we
are in a SFINAE context, simply return error_mark_node.
* cp-tree.h (FNDECL_RECHECK_ACCESS_P): Rename FNDECL_HAS_ACCESS_ERRORS.

/testsuite
2012-08-02  Jason Merrill  <jason@redhat.com>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51213 (again)
* g++.dg/cpp0x/sfinae37.C: Extend.

Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r190093

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/sfinae37.C

index 8c2272e9d539ba83a9a04e8a4fa3246b97a121cb..92c9db1a99e2c5eecb1a29ed8da1db26efa67707 100644 (file)
@@ -1,3 +1,15 @@
+2012-08-02  Jason Merrill  <jason@redhat.com>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51213 (again)
+       * pt.c (type_unification_real): Call push_deferring_access_checks /
+       pop_deferring_access_checks around the substitution of default
+       template args.
+       (instantiate_template_1): When the specialization returned by
+       retrieve_specialization has FNDECL_HAS_ACCESS_ERRORS set and we
+       are in a SFINAE context, simply return error_mark_node.
+       * cp-tree.h (FNDECL_RECHECK_ACCESS_P): Rename FNDECL_HAS_ACCESS_ERRORS.
+
 2012-07-31  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * pt.c (check_default_tmpl_args): Change is_primary and is_partial
index ec33d92ad92866c266b2b045f600bb4e7b75bc15..e40f11482e7323a67fc2de05efaa6235f74c1ae6 100644 (file)
@@ -729,10 +729,10 @@ DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc);
 /* Non-zero if this template specialization has access violations that
    should be rechecked when the function is instantiated outside argument
    deduction.  */
-#define TINFO_RECHECK_ACCESS_P(NODE) \
+#define TINFO_HAS_ACCESS_ERRORS(NODE) \
   (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE)))
-#define FNDECL_RECHECK_ACCESS_P(NODE) \
-  (TINFO_RECHECK_ACCESS_P (DECL_TEMPLATE_INFO (NODE)))
+#define FNDECL_HAS_ACCESS_ERRORS(NODE) \
+  (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE)))
 
 struct GTY(()) tree_template_info {
   struct tree_common common;
index 6257502ac1ea804190ef135d2a8e75cb4b69c43f..2ae576d7f18f636f44aebd12a9ad584dcafe9da1 100644 (file)
@@ -14363,8 +14363,12 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
 
   if (spec != NULL_TREE)
     {
-      if (FNDECL_RECHECK_ACCESS_P (spec) && (complain & tf_error))
-       recheck_decl_substitution (spec, gen_tmpl, targ_ptr);
+      if (FNDECL_HAS_ACCESS_ERRORS (spec))
+       {
+         if (complain & tf_error)
+           recheck_decl_substitution (spec, gen_tmpl, targ_ptr);
+         return error_mark_node;
+       }
       return spec;
     }
 
@@ -14426,7 +14430,7 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
        {
          /* Remember to reinstantiate when we're out of SFINAE so the user
             can see the errors.  */
-         FNDECL_RECHECK_ACCESS_P (fndecl) = true;
+         FNDECL_HAS_ACCESS_ERRORS (fndecl) = true;
        }
       return error_mark_node;
     }
@@ -15122,9 +15126,11 @@ type_unification_real (tree tparms,
              location_t save_loc = input_location;
              if (DECL_P (parm))
                input_location = DECL_SOURCE_LOCATION (parm);
+             push_deferring_access_checks (dk_no_deferred);
              arg = tsubst_template_arg (arg, targs, complain, NULL_TREE);
              arg = convert_template_argument (parm, arg, targs, complain,
                                               i, NULL_TREE);
+             pop_deferring_access_checks ();
              input_location = save_loc;
              if (arg == error_mark_node)
                return 1;
index 3941926ab499e56b8311e57607fd93791ce0e95e..14659cd123e46809e6d5fdb5a553c76113ae4aa1 100644 (file)
@@ -1,3 +1,9 @@
+2012-08-02  Jason Merrill  <jason@redhat.com>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51213 (again)
+       * g++.dg/cpp0x/sfinae37.C: Extend.
+
 2012-08-02  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/50672
index 071923e52615af39c2af448aa5b99e58c3955595..e89106aac34060513ecf9d17e2b6ad70176730c5 100644 (file)
@@ -5,6 +5,12 @@ class C {
   typedef int type;
 };
 
+template<int>
+struct I;
+
+template<>
+struct I<2> { };
+
 template<class T, class = typename T::type>
 auto f(int) -> char;
 
@@ -13,6 +19,10 @@ auto f(...) -> char (&)[2];
 
 static_assert(sizeof(f<C>(0)) == 2, "Ouch");
 
+typedef int testf[sizeof(f<C>(0)) == 2 ? 1 : -1];
+
+I<sizeof(f<C>(0))> vf;
+
 template<class T>
 auto g(int) -> decltype(typename T::type(), char());
 
@@ -20,3 +30,7 @@ template<class>
 auto g(...) -> char (&)[2];
 
 static_assert(sizeof(g<C>(0)) == 2, "Ouch");
+
+typedef int testg[sizeof(g<C>(0)) == 2 ? 1 : -1];
+
+I<sizeof(g<C>(0))> vg;