From 9c719c74a549d518bc38965e0a48f78d3d02adf0 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 9 Apr 2010 15:20:58 +0000 Subject: [PATCH] PR c++/42623 * c-common.c (c_sizeof_or_alignof_type): Return error_mark_node for incomplete type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158167 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/c-common.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/sizeof13.C | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/sizeof13.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74eb521187c..2b3338e2c9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2010-04-09 Jason Merrill + PR c++/42623 + * c-common.c (c_sizeof_or_alignof_type): Return error_mark_node + for incomplete type. + PR c++/41788 * stor-layout.c (finalize_record_size): Don't change TYPE_PACKED based on a warning flag. diff --git a/gcc/c-common.c b/gcc/c-common.c index 32dc21e93af..5772b833df0 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -4390,7 +4390,7 @@ c_sizeof_or_alignof_type (location_t loc, if (complain) error_at (loc, "invalid application of %qs to incomplete type %qT ", op_name, type); - value = size_zero_node; + return error_mark_node; } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51895eeccd3..ea156f67b0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-09 Jason Merrill + + PR c++/42623 + * g++.dg/template/sizeof13.C: New. + 2010-04-09 Kai Tietz * g++.dg/other/pr35504.C: Add check for thiscall. diff --git a/gcc/testsuite/g++.dg/template/sizeof13.C b/gcc/testsuite/g++.dg/template/sizeof13.C new file mode 100644 index 00000000000..2f4a26e509d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof13.C @@ -0,0 +1,17 @@ +// PR c++/42623 +// We should choose f(B) because f(A) involves applying sizeof to +// an incomplete class, so it is removed by SFINAE. +// { dg-do link } + +struct undef; + +template struct A { A(int); }; +template void f(A); + +template struct B { B(int) { } }; +template void f(B) { } + +int main() +{ + f(0); +} -- 2.11.4.GIT