From 95cd6f6f66b75aebb3d479840a6949e3fbc09e46 Mon Sep 17 00:00:00 2001 From: Josh Conner Date: Fri, 4 Nov 2005 01:23:22 +0000 Subject: [PATCH] re PR c++/19989 (Inconsistency with zero-sized arrays) PR c++/19989 cp/pt.c (tsubst): Accept zero-length array if tf_error is set in complain flags. Change error message for negative- length array. testsuite/g++.dg/ext/array2.C: New test. testsuite/g++.dg/template/dependent-name3.C: New test. testsuite/g++.dg/template/dependent-name4.C: New test. testsuite/g++.dg/template/sfinae2.C: New test. From-SVN: r106468 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/pt.c | 31 +++++++++---------- gcc/testsuite/ChangeLog | 8 +++++ gcc/testsuite/g++.dg/ext/array2.C | 18 +++++++++++ .../g++.dg/template/dependent-name3.C | 17 ++++++++++ .../g++.dg/template/dependent-name4.C | 15 +++++++++ gcc/testsuite/g++.dg/template/sfinae2.C | 17 ++++++++++ 7 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/array2.C create mode 100644 gcc/testsuite/g++.dg/template/dependent-name3.C create mode 100644 gcc/testsuite/g++.dg/template/dependent-name4.C create mode 100644 gcc/testsuite/g++.dg/template/sfinae2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a270fba8e8a..2d82433628b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2005-11-03 Josh Conner + + PR c++/19989 + pt.c (tsubst): Accept zero-length array if tf_error is set + in complain flags. Change error message for negative- + length array. + 2005-11-04 Joseph S. Myers * cp-tree.h (cp_cpp_error), error.c (cp_cpp_error): Take va_list* diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1efd808ff4e..0490fd18ba7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7083,25 +7083,24 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) max = tsubst_template_arg (omax, args, complain, in_decl); max = fold_decl_constant_value (max); - if (integer_zerop (omax)) - { - /* Still allow an explicit array of size zero. */ - if (pedantic) - pedwarn ("creating array with size zero"); - } - else if (integer_zerop (max) - || (TREE_CODE (max) == INTEGER_CST - && INT_CST_LT (max, integer_zero_node))) - { - /* [temp.deduct] + /* [temp.deduct] - Type deduction may fail for any of the following - reasons: + Type deduction may fail for any of the following + reasons: - Attempting to create an array with a size that is - zero or negative. */ + Attempting to create an array with a size that is + zero or negative. */ + if (integer_zerop (max) && !(complain & tf_error)) + /* We must fail if performing argument deduction (as + indicated by the state of complain), so that + another substitution can be found. */ + return error_mark_node; + + else if (TREE_CODE (max) == INTEGER_CST + && INT_CST_LT (max, integer_zero_node)) + { if (complain & tf_error) - error ("creating array with size zero (%qE)", max); + error ("creating array with negative size (%qE)", max); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 722318fdaec..093e2948b8e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2005-11-03 Josh Conner + + PR c++/19989 + g++.dg/ext/array2.C: New test. + g++.dg/template/dependent-name3.C: New test. + g++.dg/template/dependent-name4.C: New test. + g++.dg/template/sfinae2.C: New test. + 2005-11-03 Andrew Pinski PR preprocessor/22042 diff --git a/gcc/testsuite/g++.dg/ext/array2.C b/gcc/testsuite/g++.dg/ext/array2.C new file mode 100644 index 00000000000..2d645ca94b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/array2.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Avoid -pedantic-error default +// { dg-options "" } + +// PR 19989 - dependent array of size 0 fails to compile. + +template struct A +{ + static const int zero = 0; +}; + +template struct B +{ + int x[A::zero]; +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/dependent-name3.C b/gcc/testsuite/g++.dg/template/dependent-name3.C new file mode 100644 index 00000000000..bbe6fb66266 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name3.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Dependent arrays of invalid size generate appropriate error messages + +template struct A +{ + static const int zero = 0; + static const int minus_one = -1; +}; + +template struct B +{ + int x[A::zero]; // { dg-error "zero" } + int y[A::minus_one]; // { dg-error "negative" } +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/dependent-name4.C b/gcc/testsuite/g++.dg/template/dependent-name4.C new file mode 100644 index 00000000000..b2b5814befb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name4.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Dependent arrays of invalid size cause template instantiation failure. + +// We'll get an error message (duplicate matching templates) if the first +// pattern is incorrectly allowed to match. + +template void foobar (int (*) [M] = 0 ); +template void foobar ( ); + +void fn (void) +{ + foobar<0>(); + foobar<-1>(); +} diff --git a/gcc/testsuite/g++.dg/template/sfinae2.C b/gcc/testsuite/g++.dg/template/sfinae2.C new file mode 100644 index 00000000000..89880a85f43 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae2.C @@ -0,0 +1,17 @@ +// PR c++/19989 +// Don't instantiate a function template if it would generate an +// array of size zero. + +// { dg-do compile } + +template struct cl { + const static int value = T; +}; + +template void fn (char (*) [cl::value] = 0 ); + +void foo (void) +{ + fn<0> (); // { dg-error "no matching function" } +} +