From: dodji Date: Mon, 29 Nov 2010 16:31:40 +0000 (+0000) Subject: Fix PR c++/42260 and ensure PR c++/45383 is fixed X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8e8ac75a13190747d6c7ce8f0fb4efe5f52cd40e;p=thirdparty%2Fgcc.git Fix PR c++/42260 and ensure PR c++/45383 is fixed gcc/cp/ c++/42260 * call.c (add_builtin_candidate): At this point the resulting type of an indirection operator should be complete. gcc/testsuite/ c++/42260 c++/45383 * g++.dg/conversion/cast2.C: New test. * g++.dg/conversion/cond4/C: Likewise. Ensures we don't regress on PR c++/45383 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167250 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index feb9620bdcd7..40dd7e299e92 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-11-29 Dodji Seketeli + + PR c++/42260 + * call.c (add_builtin_candidate): At this point the resulting type + of an indirection operator should be complete. + 2010-11-29 Dodji Seketeli PR c++/45383 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d107a71747e6..0f016ca324a6 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -2022,6 +2022,7 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code, case INDIRECT_REF: if (TREE_CODE (type1) == POINTER_TYPE + && is_complete (TREE_TYPE (type1)) && (TYPE_PTROB_P (type1) || TREE_CODE (TREE_TYPE (type1)) == FUNCTION_TYPE)) break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1ebffbbaeb6..1cfb5b2dfe6b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-11-29 Dodji Seketeli + + PR c++/42260 + * g++.dg/conversion/cast2.C: New test. + * g++.dg/conversion/cond4/C: Likewise. This ensures we don't regress on + PR c++/45383 + 2010-11-29 Dodji Seketeli PR c++/45383 diff --git a/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc/testsuite/g++.dg/conversion/cast2.C new file mode 100644 index 000000000000..ac8329730ea6 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast2.C @@ -0,0 +1,9 @@ +// Origin: PR c++/42260 +// { dg-do compile } + +struct A +{ + template operator T*(); +}; + +int i = *A();// { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/conversion/cond4.C b/gcc/testsuite/g++.dg/conversion/cond4.C new file mode 100644 index 000000000000..3bd64763a183 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond4.C @@ -0,0 +1,31 @@ +// Origin: PR c++/45383 +// { dg-do run } + +struct null { + null() {} + template + operator T*() const { + return 0; + } + + template + operator T C::*() const { + return 0; + } +private: + null(const null&); + null& operator=(const null&); + void operator&() const; +}; + +static struct null null; + +int +main() +{ + int* ptr = null; + if (ptr == null) + return 0; + if (ptr != null) + return 1; +}