From f4ecc8fd6b67ce601991e0f59a226bb5a18bed16 Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Wed, 4 Nov 2009 17:29:35 -0500
Subject: [PATCH] re PR c++/39413 (static_assert and SFINAE)

	PR c++/39413
	* search.c (lookup_base): Don't complete_type (base).

From-SVN: r153920
---
 gcc/cp/ChangeLog                           |  3 +++
 gcc/cp/search.c                            |  6 +++--
 gcc/testsuite/ChangeLog                    |  6 +++++
 gcc/testsuite/g++.dg/template/nested3.C    |  7 +++---
 gcc/testsuite/g++.dg/template/overload11.C | 27 ++++++++++++++++++++++
 5 files changed, 43 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/overload11.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 82104d280b56..edf3ca86a968 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 2009-11-04  Jason Merrill  <jason@redhat.com>
 
+	PR c++/39413
+	* search.c (lookup_base): Don't complete_type (base).
+
 	PR c++/35067
 	* method.c (use_thunk): Check DECL_WEAK as well as
 	DECL_ONE_ONLY.
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index d6521fb6f823..356f3d6f52b5 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -214,9 +214,11 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
       t_binfo = TYPE_BINFO (t);
     }
 
-  base = complete_type (TYPE_MAIN_VARIANT (base));
+  base = TYPE_MAIN_VARIANT (base);
 
-  if (t_binfo)
+  /* If BASE is incomplete, it can't be a base of T--and instantiating it
+     might cause an error.  */
+  if (t_binfo && (COMPLETE_TYPE_P (base) || TYPE_BEING_DEFINED (base)))
     {
       struct lookup_base_data_s data;
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5f63688f2fcc..61f8450e081a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-04  Jason Merrill  <jason@redhat.com>
+
+	PR c++/39413
+	* g++.dg/template/overload11.C: New.
+	* g++.dg/template/nested3.C: Adjust.
+
 2009-11-04  Eric Botcazou  <ebotcazou@adacore.com>
 
 	PR ada/20548
diff --git a/gcc/testsuite/g++.dg/template/nested3.C b/gcc/testsuite/g++.dg/template/nested3.C
index 1ae4bf7647d4..5652e178a703 100644
--- a/gcc/testsuite/g++.dg/template/nested3.C
+++ b/gcc/testsuite/g++.dg/template/nested3.C
@@ -5,13 +5,13 @@ class A {
     int _k;
   };
   T1 _t1;
-  T2 _t2; // { dg-message "instantiated" }
+  T2 _t2;
 };
 
 template <class U>
-class B { // { dg-error "declaration" }
+class B {
   class SubB1 {
-    B _i; // { dg-error "incomplete type" }
+    B _i;
   };
 
   class SubB2 {
@@ -19,7 +19,6 @@ class B { // { dg-error "declaration" }
   };
   A<U,SubB1>::SubA<SubB2> _a; // { dg-error "not a base type" "not base" }
 		// { dg-message "note" "note" { target *-*-* } 20 }
-		// { dg-message "instantiated" "inst" { target *-*-* } 20 }
 		// { dg-error "non-template" "non-template" { target *-*-* } 20 }
 };
 
diff --git a/gcc/testsuite/g++.dg/template/overload11.C b/gcc/testsuite/g++.dg/template/overload11.C
new file mode 100644
index 000000000000..d7b0a7c9f1c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/overload11.C
@@ -0,0 +1,27 @@
+// PR c++/39413
+// We don't need to instantiate Wrapper<int> to check the
+// foo(const Thingy&) overload.
+
+template <class T> struct Incomplete;
+
+template <typename T> class Wrapper
+{
+  Incomplete<T> i;
+};
+
+template <typename T> struct Thingy
+{
+  Thingy();
+  Thingy(const Wrapper<T>& v);
+
+  template <typename X> void foo(const Thingy<X>&);
+  void foo(const Thingy&);
+};
+
+int main()
+{
+    Thingy<int> ap1;
+    Thingy<float> bp1;
+
+    ap1.foo(bp1);
+}
-- 
GitLab