aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2010-11-18 16:24:56 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2010-11-18 16:24:56 +0000
commitfb52b50a920a7571af3de43d679fa42483c56a96 (patch)
tree45ef94c714a23d36859dc3c9c965f946052c1cbc /gcc/cp
parentcfaa55890b6f9fb5fde5c84fc51326427dc48259 (diff)
downloadgcc-fb52b50a920a7571af3de43d679fa42483c56a96.zip
gcc-fb52b50a920a7571af3de43d679fa42483c56a96.tar.gz
gcc-fb52b50a920a7571af3de43d679fa42483c56a96.tar.bz2
re PR c/33193 (slopiness in __real/__imag)
gcc/ PR c/33193 * c-typeck.c (build_unary_op): Call build_real_imag_expr for REALPART_EXPR and IMAGPART_EXPR. gcc/c-family/ PR c/33193 * c-common.h (build_real_imag_expr): Declare. * c-semantics.c (build_real_imag_expr): Define. gcc/cp/ PR c/33193 * typeck.c (cp_build_unary_op): Call build_real_imag_expr for REALPART_EXPR and IMAGPART_EXPR. gcc/testsuite/ PR c/33193 * c-c++-common/pr33193.c: New test. From-SVN: r166909
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c22
2 files changed, 10 insertions, 18 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8c76af6..6f9bb07 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-18 Nathan Froyd <froydnj@codesourcery.com>
+
+ PR c/33193
+ * typeck.c (cp_build_unary_op): Call build_real_imag_expr for
+ REALPART_EXPR and IMAGPART_EXPR.
+
2010-11-16 Jason Merrill <jason@redhat.com>
* call.c (convert_like_real): Don't make a temp for copy-list-init.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 92a7d9e..df31d87 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -5098,26 +5098,12 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
break;
case REALPART_EXPR:
- if (TREE_CODE (arg) == COMPLEX_CST)
- return TREE_REALPART (arg);
- else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
- {
- arg = build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
- return fold_if_not_in_template (arg);
- }
- else
- return arg;
-
case IMAGPART_EXPR:
- if (TREE_CODE (arg) == COMPLEX_CST)
- return TREE_IMAGPART (arg);
- else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
- {
- arg = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
- return fold_if_not_in_template (arg);
- }
+ arg = build_real_imag_expr (input_location, code, arg);
+ if (arg == error_mark_node)
+ return arg;
else
- return cp_convert (TREE_TYPE (arg), integer_zero_node);
+ return fold_if_not_in_template (arg);
case PREINCREMENT_EXPR:
case POSTINCREMENT_EXPR: