From 3081b369155a1336913e8dae84260f72c8237c9c Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 18 Nov 2011 15:51:41 +0000 Subject: [PATCH] re PR c++/51150 ([C++11][4.6/4.7 Regression] ICE when result of -> initializes const variable of different type) /cp 2011-11-18 Paolo Carlini PR c++/51150 * pt.c (tsubst_copy_and_build): Handle FIX_TRUNC_EXPR. /testsuite 2011-11-18 Paolo Carlini PR c++/51150 * g++.dg/cpp0x/pr51150.C: New. From-SVN: r181479 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/pr51150.C | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr51150.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 58a51fd1e499..aee5bec83476 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-11-18 Paolo Carlini + + PR c++/51150 + * pt.c (tsubst_copy_and_build): Handle FIX_TRUNC_EXPR. + 2011-11-07 Jason Merrill PR c++/50870 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9577bd8f6c69..a94b10f347ae 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12707,6 +12707,10 @@ tsubst_copy_and_build (tree t, return build_x_unary_op (TREE_CODE (t), RECUR (TREE_OPERAND (t, 0)), complain); + case FIX_TRUNC_EXPR: + return cp_build_unary_op (FIX_TRUNC_EXPR, RECUR (TREE_OPERAND (t, 0)), + 0, complain); + case ADDR_EXPR: op1 = TREE_OPERAND (t, 0); if (TREE_CODE (op1) == LABEL_DECL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17a000e5ae3d..8dc9f39a0464 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-18 Paolo Carlini + + PR c++/51150 + * g++.dg/cpp0x/pr51150.C: New. + 2011-11-16 Richard Earnshaw Bernd Schmidt Sebastian Huber diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc/testsuite/g++.dg/cpp0x/pr51150.C new file mode 100644 index 000000000000..37eb166b43e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51150.C @@ -0,0 +1,20 @@ +// PR c++/51150 +// { dg-options "-std=c++0x" } + +struct Clock { + double Now(); +}; +template void Foo(Clock* clock) { + const int now = clock->Now(); +} + +template void Foo(Clock*); + +template void Boo(int val) { + const int now1 = (double)(val); + const int now2 = const_cast(val); // { dg-error "invalid" } + const int now3 = static_cast(val); + const int now4 = reinterpret_cast(val); // { dg-error "invalid" } +} + +template void Boo(int); -- 2.47.2