From f4ecc8fd6b67ce601991e0f59a226bb5a18bed16 Mon Sep 17 00:00:00 2001 From: Jason Merrill 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 + 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 + + PR c++/39413 + * g++.dg/template/overload11.C: New. + * g++.dg/template/nested3.C: Adjust. + 2009-11-04 Eric Botcazou 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 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::SubA _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 to check the +// foo(const Thingy&) overload. + +template struct Incomplete; + +template class Wrapper +{ + Incomplete i; +}; + +template struct Thingy +{ + Thingy(); + Thingy(const Wrapper& v); + + template void foo(const Thingy&); + void foo(const Thingy&); +}; + +int main() +{ + Thingy ap1; + Thingy bp1; + + ap1.foo(bp1); +}