diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-01-18 20:27:23 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-01-18 20:27:23 +0000 |
commit | 55e83c66c7cbe6ac0ef526d7c70462eacde9511d (patch) | |
tree | 3aae7cc44cafb04a147e67f1c2cb90571b26ebe3 | |
parent | 66b432fd29b9d3a58ccac007b89f0460906a74d3 (diff) | |
download | gcc-55e83c66c7cbe6ac0ef526d7c70462eacde9511d.zip gcc-55e83c66c7cbe6ac0ef526d7c70462eacde9511d.tar.gz gcc-55e83c66c7cbe6ac0ef526d7c70462eacde9511d.tar.bz2 |
re PR c++/51225 ([c++0x] [4.7 Regression] ICE with invalid template parameter)
/cp
2012-01-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51225
* typeck2.c (store_init_value): Within a template guard
cxx_constant_value with require_potential_constant_expression.
* pt.c (convert_nontype_argument): Likewise.
/testsuite
2012-01-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51225
* g++.dg/cpp0x/pr51225.C: New.
From-SVN: r183286
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr51225.C | 14 |
5 files changed, 37 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e90f833..b0660ce 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-01-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51225 + * typeck2.c (store_init_value): Within a template guard + cxx_constant_value with require_potential_constant_expression. + * pt.c (convert_nontype_argument): Likewise. + 2012-01-16 Jakub Jelinek <jakub@redhat.com> PR c++/51854 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f2b4c8e..87ec5f5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5807,6 +5807,9 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) if (complain & tf_error) { int errs = errorcount, warns = warningcount; + if (processing_template_decl + && !require_potential_constant_expression (expr)) + return NULL_TREE; expr = cxx_constant_value (expr); if (errorcount > errs || warningcount > warns) inform (EXPR_LOC_OR_HERE (expr), diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index a1b4274..7793744 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -718,8 +718,14 @@ store_init_value (tree decl, tree init, VEC(tree,gc)** cleanups, int flags) value = fold_non_dependent_expr (value); value = maybe_constant_init (value); if (DECL_DECLARED_CONSTEXPR_P (decl)) - /* Diagnose a non-constant initializer for constexpr. */ - value = cxx_constant_value (value); + { + /* Diagnose a non-constant initializer for constexpr. */ + if (processing_template_decl + && !require_potential_constant_expression (value)) + value = error_mark_node; + else + value = cxx_constant_value (value); + } const_init = (reduced_constant_expression_p (value) || error_operand_p (value)); DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = const_init; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 352f15d..e79f00b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51225 + * g++.dg/cpp0x/pr51225.C: New. + 2012-01-17 Ian Lance Taylor <iant@google.com> PR go/50656 diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51225.C b/gcc/testsuite/g++.dg/cpp0x/pr51225.C new file mode 100644 index 0000000..6fcf861 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51225.C @@ -0,0 +1,14 @@ +// PR c++/51225 +// { dg-options "-std=c++0x" } + +template<int> struct A {}; + +template<typename> void foo() +{ + A<int(x)> a; // { dg-error "not declared|invalid type" } +} + +template<typename> struct bar +{ + static constexpr A<1> b = A<1>(x); // { dg-error "not declared" } +}; |