public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "aoliva at redhat dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/19199] [3.3/3.4/4.0/4.1 Regression] Wrong warning about returning a reference to a temporary Date: Mon, 04 Apr 2005 13:32:00 -0000 [thread overview] Message-ID: <20050404133228.25702.qmail@sourceware.org> (raw) In-Reply-To: <20041230105911.19199.lars@trolltech.com> ------- Additional Comments From aoliva at gcc dot gnu dot org 2005-04-04 13:32 ------- Subject: Re: [Committed] PR c++/19199: Preserve COND_EXPR lvalueness in fold On Apr 4, 2005, Roger Sayle <roger@eyesopen.com> wrote: > (fold_cond_expr_with_comparison): Preserve lvalue-ness for the > C++ front-end prior to lowering into gimple form. > * expr2.C: Fixed. Err... Why did you choose to drop the portion of the patch below, that would have avoided the ugliness of comparing langhooks.name, but still retained it in the ChangeLog entry? Index: fold-const.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v retrieving revision 1.554 diff -u -p -d -u -p -d -u -p -r1.554 fold-const.c --- fold-const.c 4 Apr 2005 08:50:25 -0000 1.554 +++ fold-const.c 4 Apr 2005 13:25:47 -0000 @@ -4173,7 +4173,15 @@ fold_cond_expr_with_comparison (tree typ tree arg00 = TREE_OPERAND (arg0, 0); tree arg01 = TREE_OPERAND (arg0, 1); tree arg1_type = TREE_TYPE (arg1); - tree tem; + tree tem = NULL; + /* If the COND_EXPR can possibly be an lvalue, we don't want to + perform transformations that return a simplified result that will + be recognized as lvalue, but that will not match the expected + result. We may still return other expressions that would be + incorrect, but those are going to be rvalues, and the caller is + supposed to discard them. */ + bool lvalue = !pedantic_lvalues + && maybe_lvalue_p (arg1) && maybe_lvalue_p (arg2); STRIP_NOPS (arg1); STRIP_NOPS (arg2); @@ -4215,10 +4223,12 @@ fold_cond_expr_with_comparison (tree typ case EQ_EXPR: case UNEQ_EXPR: tem = fold_convert (arg1_type, arg1); - return pedantic_non_lvalue (fold_convert (type, negate_expr (tem))); + tem = pedantic_non_lvalue (fold_convert (type, negate_expr (tem))); + break; case NE_EXPR: case LTGT_EXPR: - return pedantic_non_lvalue (fold_convert (type, arg1)); + tem = pedantic_non_lvalue (fold_convert (type, arg1)); + break; case UNGE_EXPR: case UNGT_EXPR: if (flag_trapping_math) @@ -4230,7 +4240,8 @@ fold_cond_expr_with_comparison (tree typ arg1 = fold_convert (lang_hooks.types.signed_type (TREE_TYPE (arg1)), arg1); tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1); - return pedantic_non_lvalue (fold_convert (type, tem)); + tem = pedantic_non_lvalue (fold_convert (type, tem)); + break; case UNLE_EXPR: case UNLT_EXPR: if (flag_trapping_math) @@ -4241,12 +4252,18 @@ fold_cond_expr_with_comparison (tree typ arg1 = fold_convert (lang_hooks.types.signed_type (TREE_TYPE (arg1)), arg1); tem = fold_build1 (ABS_EXPR, TREE_TYPE (arg1), arg1); - return negate_expr (fold_convert (type, tem)); + tem = negate_expr (fold_convert (type, tem)); + break; default: gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison); break; } + if (tem && (! lvalue || maybe_lvalue_p (tem))) + return tem; + else + tem = NULL; + /* A != 0 ? A : 0 is simply A, unless A is -0. Likewise A == 0 ? A : 0 is always 0 unless A is -0. Note that both transformations are correct when A is NaN: A != 0 @@ -4255,11 +4272,16 @@ fold_cond_expr_with_comparison (tree typ if (integer_zerop (arg01) && integer_zerop (arg2)) { if (comp_code == NE_EXPR) - return pedantic_non_lvalue (fold_convert (type, arg1)); + tem = pedantic_non_lvalue (fold_convert (type, arg1)); else if (comp_code == EQ_EXPR) - return fold_convert (type, integer_zero_node); + tem = fold_convert (type, integer_zero_node); } + if (tem && (! lvalue || maybe_lvalue_p (tem))) + return tem; + else + tem = NULL; + /* Try some transformations of A op B ? A : B. A == B? A : B same as B @@ -4309,9 +4331,15 @@ fold_cond_expr_with_comparison (tree typ switch (comp_code) { case EQ_EXPR: - return pedantic_non_lvalue (fold_convert (type, arg2)); + if (lvalue) + break; + tem = pedantic_non_lvalue (fold_convert (type, arg2)); + break; case NE_EXPR: - return pedantic_non_lvalue (fold_convert (type, arg1)); + if (lvalue) + break; + tem = pedantic_non_lvalue (fold_convert (type, arg1)); + break; case LE_EXPR: case LT_EXPR: case UNLE_EXPR: @@ -4327,7 +4355,7 @@ fold_cond_expr_with_comparison (tree typ tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR) ? fold_build2 (MIN_EXPR, comp_type, comp_op0, comp_op1) : fold_build2 (MIN_EXPR, comp_type, comp_op1, comp_op0); - return pedantic_non_lvalue (fold_convert (type, tem)); + tem = pedantic_non_lvalue (fold_convert (type, tem)); } break; case GE_EXPR: @@ -4341,16 +4369,16 @@ fold_cond_expr_with_comparison (tree typ tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR) ? fold_build2 (MAX_EXPR, comp_type, comp_op0, comp_op1) : fold_build2 (MAX_EXPR, comp_type, comp_op1, comp_op0); - return pedantic_non_lvalue (fold_convert (type, tem)); + tem = pedantic_non_lvalue (fold_convert (type, tem)); } break; case UNEQ_EXPR: - if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) - return pedantic_non_lvalue (fold_convert (type, arg2)); + if (! lvalue && !HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) + tem = pedantic_non_lvalue (fold_convert (type, arg2)); break; case LTGT_EXPR: - if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) - return pedantic_non_lvalue (fold_convert (type, arg1)); + if (! lvalue && !HONOR_NANS (TYPE_MODE (TREE_TYPE (arg1)))) + tem = pedantic_non_lvalue (fold_convert (type, arg1)); break; default: gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison); @@ -4358,6 +4386,11 @@ fold_cond_expr_with_comparison (tree typ } } + if (tem && (! lvalue || maybe_lvalue_p (tem))) + return tem; + else + tem = NULL; + /* If this is A op C1 ? A : C2 with C1 and C2 constant integers, we might still be able to simplify this. For example, if C1 is one less or one more than C2, this might have started @@ -4372,7 +4405,7 @@ fold_cond_expr_with_comparison (tree typ case EQ_EXPR: /* We can replace A with C1 in this case. */ arg1 = fold_convert (type, arg01); - return fold_build3 (COND_EXPR, type, arg0, arg1, arg2); + tem = fold_build3 (COND_EXPR, type, arg0, arg1, arg2); case LT_EXPR: /* If C1 is C2 + 1, this is min(A, C2). */ @@ -4382,8 +4415,8 @@ fold_cond_expr_with_comparison (tree typ const_binop (PLUS_EXPR, arg2, integer_one_node, 0), OEP_ONLY_CONST)) - return pedantic_non_lvalue (fold_build2 (MIN_EXPR, - type, arg1, arg2)); + tem = pedantic_non_lvalue (fold_build2 (MIN_EXPR, + type, arg1, arg2)); break; case LE_EXPR: @@ -4394,8 +4427,8 @@ fold_cond_expr_with_comparison (tree typ const_binop (MINUS_EXPR, arg2, integer_one_node, 0), OEP_ONLY_CONST)) - return pedantic_non_lvalue (fold_build2 (MIN_EXPR, - type, arg1, arg2)); + tem = pedantic_non_lvalue (fold_build2 (MIN_EXPR, + type, arg1, arg2)); break; case GT_EXPR: @@ -4406,8 +4439,8 @@ fold_cond_expr_with_comparison (tree typ const_binop (MINUS_EXPR, arg2, integer_one_node, 0), OEP_ONLY_CONST)) - return pedantic_non_lvalue (fold_build2 (MAX_EXPR, - type, arg1, arg2)); + tem = pedantic_non_lvalue (fold_build2 (MAX_EXPR, + type, arg1, arg2)); break; case GE_EXPR: @@ -4418,8 +4451,8 @@ fold_cond_expr_with_comparison (tree typ const_binop (PLUS_EXPR, arg2, integer_one_node, 0), OEP_ONLY_CONST)) - return pedantic_non_lvalue (fold_build2 (MAX_EXPR, - type, arg1, arg2)); + tem = pedantic_non_lvalue (fold_build2 (MAX_EXPR, + type, arg1, arg2)); break; case NE_EXPR: break; @@ -4427,6 +4460,11 @@ fold_cond_expr_with_comparison (tree typ gcc_unreachable (); } + if (tem && (! lvalue || maybe_lvalue_p (tem))) + return tem; + else + tem = NULL; + return NULL_TREE; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19199
next prev parent reply other threads:[~2005-04-04 13:32 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2004-12-30 10:59 [Bug c++/19199] New: " lars at trolltech dot com 2004-12-30 14:49 ` [Bug c++/19199] [3.3/3.4/4.0 Regression] " pinskia at gcc dot gnu dot org 2004-12-31 12:45 ` steven at gcc dot gnu dot org 2004-12-31 14:51 ` pinskia at gcc dot gnu dot org 2005-01-01 0:21 ` rth at gcc dot gnu dot org 2005-01-02 0:43 ` gdr at integrable-solutions dot net 2005-01-07 1:11 ` pinskia at gcc dot gnu dot org 2005-01-07 8:09 ` mmitchel at gcc dot gnu dot org 2005-01-09 4:46 ` rth at gcc dot gnu dot org 2005-01-26 18:02 ` amylaar at gcc dot gnu dot org 2005-01-27 23:08 ` amylaar at gcc dot gnu dot org 2005-03-04 8:13 ` [Bug c++/19199] [3.3/3.4/4.0/4.1 " mmitchel at gcc dot gnu dot org 2005-03-04 19:08 ` aoliva at redhat dot com 2005-03-06 0:14 ` mark at codesourcery dot com 2005-03-07 3:28 ` aoliva at redhat dot com 2005-03-07 4:19 ` mark at codesourcery dot com 2005-03-08 23:23 ` aoliva at redhat dot com 2005-03-09 1:29 ` roger at eyesopen dot com 2005-03-09 4:11 ` aoliva at redhat dot com 2005-03-25 6:04 ` roger at eyesopen dot com 2005-03-25 6:29 ` mark at codesourcery dot com 2005-03-30 2:55 ` aoliva at gcc dot gnu dot org 2005-03-30 7:20 ` mark at codesourcery dot com 2005-04-02 17:29 ` aoliva at redhat dot com 2005-04-03 3:20 ` roger at eyesopen dot com 2005-04-04 0:37 ` mark at codesourcery dot com 2005-04-04 5:02 ` cvs-commit at gcc dot gnu dot org 2005-04-04 13:32 ` aoliva at redhat dot com [this message] 2005-04-04 13:41 ` joseph at codesourcery dot com 2005-04-04 13:51 ` aoliva at redhat dot com 2005-04-04 15:03 ` aoliva at redhat dot com 2005-04-04 16:02 ` roger at eyesopen dot com 2005-04-04 16:40 ` mark at codesourcery dot com 2005-04-04 20:18 ` [Bug c++/19199] [3.3/3.4/4.0 " aoliva at redhat dot com 2005-04-04 23:01 ` mark at codesourcery dot com 2005-04-05 5:16 ` cvs-commit at gcc dot gnu dot org 2005-04-05 23:14 ` [Bug c++/19199] [3.3/3.4 " roger at eyesopen dot com 2005-04-05 23:49 ` mark at codesourcery dot com 2005-04-06 0:04 ` roger at eyesopen dot com 2005-04-29 18:28 ` mmitchel at gcc dot gnu dot org
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20050404133228.25702.qmail@sourceware.org \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).