]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/17232
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Mar 2013 03:25:16 +0000 (03:25 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Mar 2013 03:25:16 +0000 (03:25 +0000)
PR c++/56642
* pt.c (tsubst_decl): Check return value of register_specialization.
* typeck2.c (abstract_virtuals_error_sfinae): Re-apply complete_type
change.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196849 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/template/abstract-dr337.C
gcc/testsuite/g++.dg/template/friend54.C [new file with mode: 0644]

index b2796b6ca13cc9769c8de3d36407eabf09de75bd..4191c860786f454c212c3da76be45f2153f57db1 100644 (file)
@@ -1,3 +1,11 @@
+2013-03-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/17232
+       PR c++/56642
+       * pt.c (tsubst_decl): Check return value of register_specialization.
+       * typeck2.c (abstract_virtuals_error_sfinae): Re-apply complete_type
+       change.
+
 2013-03-17  Jason Merrill  <jason@redhat.com>
 
        PR c++/54359
index 427447913ecfb9cc7a0c1ad58913a2ffbd40e580..531d8607aff393b0ac5eb46f3e09c030067edec6 100644 (file)
@@ -10285,7 +10285,13 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
            DECL_TEMPLATE_INFO (r)
              = build_template_info (gen_tmpl, argvec);
            SET_DECL_IMPLICIT_INSTANTIATION (r);
-           register_specialization (r, gen_tmpl, argvec, false, hash);
+
+           tree new_r
+             = register_specialization (r, gen_tmpl, argvec, false, hash);
+           if (new_r != r)
+             /* We instantiated this while substituting into
+                the type earlier (template/friend54.C).  */
+             RETURN (new_r);
 
            /* We're not supposed to instantiate default arguments
               until they are called, for a template.  But, for a
index 24b559385276d19dd775e9527900c53cebf7fc02..3bac67cf1192f567fb1b3988b9984973553c7e29 100644 (file)
@@ -265,6 +265,10 @@ abstract_virtuals_error_sfinae (tree decl, tree type, abstract_class_use use,
     return 0;
   type = TYPE_MAIN_VARIANT (type);
 
+  /* In SFINAE context, force instantiation.  */
+  if (!(complain & tf_error))
+    complete_type (type);
+
   /* If the type is incomplete, we register it within a hash table,
      so that we can check again once it is completed. This makes sense
      only for objects for which we have a declaration or at least a
index 4f66c1c118880e5c9ffec6511951e0f585e75b55..6905262d6cbfc43504aac42df3c7eeb40c1af729 100644 (file)
@@ -6,8 +6,8 @@ class A {
 };
 
 template<typename T>
-void g(T (*a)[1]) {}           // { dg-error "abstract" "" { xfail *-*-* } }
+void g(T (*a)[1]) {}           // { dg-error "abstract" "" }
 
 int main() {
-  g<A<int> >(0);  // { dg-error "no matching function" "" { xfail *-*-* } }
+  g<A<int> >(0);  // { dg-error "no matching function" }
 }
diff --git a/gcc/testsuite/g++.dg/template/friend54.C b/gcc/testsuite/g++.dg/template/friend54.C
new file mode 100644 (file)
index 0000000..ead7a72
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/56642
+
+template <class T> struct A;
+
+template <class T>
+A<T> f(T*) { return A<T>(); }
+
+template <class T>
+struct A
+{
+  friend A f<T>(T*);
+};
+
+int main()
+{
+  int *p = 0;
+  f(p);
+}