| Submitter | Jason Merrill |
|---|---|
| Date | March 11, 2011, 4:58 p.m. |
| Message ID | <4D7A54A6.1000206@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/86436/ |
| State | New |
| Headers | show |
Comments
Patch
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 93c1848..f9d90ad 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7523,6 +7523,8 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) } size = maybe_constant_value (size); + if (!TREE_CONSTANT (size)) + size = osize; } if (error_operand_p (size)) diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/array1.C b/gcc/testsuite/g++.dg/cpp0x/regress/array1.C new file mode 100644 index 0000000..629ab41 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/array1.C @@ -0,0 +1,16 @@ +// PR c++/47808 +// { dg-options -std=c++0x } + +template <typename T> +inline T abs (T const & x) { return x; } + +template <typename T> +void f (T) +{ + typedef int ai[(abs(0.1) > 0) ? 1 : -1]; +} + +int main() +{ + f(1); +}
The problem here was that we were tsubsting twice: first we did fold_non_dependent_expr in compute_array_index_type to try and get a constant, then because we didn't end up with a constant, we later tsubst it again. So if it didn't work out the first time, we should revert to the unfolded form. Tested x86_64-pc-linux-gnu, applied to trunk. commit 46d65806fd1f7532dc078887c8dea840ee39dcb6 Author: Jason Merrill <jason@redhat.com> Date: Fri Mar 11 11:08:00 2011 -0500 PR c++/47808 * decl.c (compute_array_index_type): Discard folding if it didn't produce a constant.