public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/107065] New: GCC treats rvalue like lvalue
@ 2022-09-28  7:35 jlame646 at gmail dot com
  2022-09-28 12:00 ` [Bug c++/107065] GCC treats rvalue as an lvalue redi at gcc dot gnu.org
                   ` (19 more replies)
  0 siblings, 20 replies; 21+ messages in thread
From: jlame646 at gmail dot com @ 2022-09-28  7:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

            Bug ID: 107065
           Summary: GCC treats rvalue like lvalue
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jlame646 at gmail dot com
  Target Milestone: ---

In the following program gcc incorrectly treats the expression `!(!b)` as
lvalue. Demo: https://godbolt.org/z/zv5En5hjG

```
#include <iostream>
template<typename T>
struct value_category {
    // Or can be an integral or enum value
    static constexpr auto value = "prvalue";
};

template<typename T>
struct value_category<T&> {
    static constexpr auto value = "lvalue";
};

template<typename T>
struct value_category<T&&> {
    static constexpr auto value = "xvalue";
};

// Double parens for ensuring we inspect an expression,
// not an entity
#define VALUE_CATEGORY(expr) value_category<decltype((expr))>::value

int main() {
    bool b = true;

    std::cout << VALUE_CATEGORY(!(!b)); //gcc wrongly prints lvalue
}

```

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
@ 2022-09-28 12:00 ` redi at gcc dot gnu.org
  2022-09-28 12:06 ` jlame646 at gmail dot com
                   ` (18 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: redi at gcc dot gnu.org @ 2022-09-28 12:00 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2022-09-28

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Reduced to remove the library dependency:

enum Cat { prvalue, lvalue, xvalue };

template<typename T>
struct value_category {
    // Or can be an integral or enum value
    static constexpr auto value = prvalue;
};

template<typename T>
struct value_category<T&> {
    static constexpr auto value = lvalue;
};

template<typename T>
struct value_category<T&&> {
    static constexpr auto value = xvalue;
};

// Double parens for ensuring we inspect an expression,
// not an entity
#define VALUE_CATEGORY(expr) value_category<decltype((expr))>::value

constexpr bool global = true;
static_assert( VALUE_CATEGORY(!(!global)) == prvalue, "GCC gets this right" );

int main()
{
  bool b = true;
  if ( VALUE_CATEGORY(!(!b)) != prvalue )
    throw 1;
}

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
  2022-09-28 12:00 ` [Bug c++/107065] GCC treats rvalue as an lvalue redi at gcc dot gnu.org
@ 2022-09-28 12:06 ` jlame646 at gmail dot com
  2022-09-28 12:09 ` jlame646 at gmail dot com
                   ` (17 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jlame646 at gmail dot com @ 2022-09-28 12:06 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #2 from Jason Liam <jlame646 at gmail dot com> ---
Here is another reduced demo: https://godbolt.org/z/hGhfrKrad


```
#include <iostream>
int main() {
    bool b = true;
    std::cout << std::is_same<decltype(!(!b)), bool>::value << "\n";

    auto bb = (!(!b));
    std::cout << std::is_same<decltype(bb), bool>::value << "\n";
}


```

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
  2022-09-28 12:00 ` [Bug c++/107065] GCC treats rvalue as an lvalue redi at gcc dot gnu.org
  2022-09-28 12:06 ` jlame646 at gmail dot com
@ 2022-09-28 12:09 ` jlame646 at gmail dot com
  2022-09-28 12:50 ` redi at gcc dot gnu.org
                   ` (16 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jlame646 at gmail dot com @ 2022-09-28 12:09 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #3 from Jason Liam <jlame646 at gmail dot com> ---
(In reply to Jonathan Wakely from comment #1)
> Reduced to remove the library dependency:
> 
> enum Cat { prvalue, lvalue, xvalue };
> 
> template<typename T>
> struct value_category {
>     // Or can be an integral or enum value
>     static constexpr auto value = prvalue;
> };
> 
> template<typename T>
> struct value_category<T&> {
>     static constexpr auto value = lvalue;
> };
> 
> template<typename T>
> struct value_category<T&&> {
>     static constexpr auto value = xvalue;
> };
> 
> // Double parens for ensuring we inspect an expression,
> // not an entity
> #define VALUE_CATEGORY(expr) value_category<decltype((expr))>::value
> 
> constexpr bool global = true;
> static_assert( VALUE_CATEGORY(!(!global)) == prvalue, "GCC gets this right"
> );
> 
> int main()
> {
>   bool b = true;
>   if ( VALUE_CATEGORY(!(!b)) != prvalue )
>     throw 1;
> }

Here is another reduced demo: https://godbolt.org/z/hGhfrKrad

```
#include <iostream>
int main() {
    bool b = true;
    std::cout << std::is_same<decltype(!(!b)), bool>::value << "\n";

    auto bb = (!(!b));
    std::cout << std::is_same<decltype(bb), bool>::value << "\n";
}


```

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (2 preceding siblings ...)
  2022-09-28 12:09 ` jlame646 at gmail dot com
@ 2022-09-28 12:50 ` redi at gcc dot gnu.org
  2022-09-28 13:41 ` mpolacek at gcc dot gnu.org
                   ` (15 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: redi at gcc dot gnu.org @ 2022-09-28 12:50 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Or as a compile-time test, not run-time:

template<class, class> struct is_same { static constexpr bool value = false; };
template<class T> struct is_same<T,T> { static constexpr bool value = true; };

int main() {
    bool b = true;
    static_assert( is_same<decltype(!(!b)), bool>::value, "");

    auto bb = (!(!b));
    static_assert( is_same<decltype(bb), bool>::value, "");
}


<source>: In function 'int main()':
<source>:5:52: error: static assertion failed
    5 |     static_assert( is_same<decltype(!(!b)), bool>::value, "");
      |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (3 preceding siblings ...)
  2022-09-28 12:50 ` redi at gcc dot gnu.org
@ 2022-09-28 13:41 ` mpolacek at gcc dot gnu.org
  2022-09-28 14:32 ` jlame646 at gmail dot com
                   ` (14 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2022-09-28 13:41 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mpolacek at gcc dot gnu.org

--- Comment #5 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Even GCC 4.8 rejects #c4, so doesn't look like a regression.

We deduce bool& in the first decltype: finish_decltype_type gets a VAR_DECL 'b'
(that's wrong I think), id_expression_or_member_access_p is false (that is
correct).  lvalue_kind then of course reports that the VAR_DECL is an ordinary
lvalue, and we deduce to bool&, just like it were decltype((b)).  So the
problem must be that we strip both NEGATE_EXPRs.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (4 preceding siblings ...)
  2022-09-28 13:41 ` mpolacek at gcc dot gnu.org
@ 2022-09-28 14:32 ` jlame646 at gmail dot com
  2022-09-28 15:34 ` mpolacek at gcc dot gnu.org
                   ` (13 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jlame646 at gmail dot com @ 2022-09-28 14:32 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #6 from Jason Liam <jlame646 at gmail dot com> ---
The bug was discovered here:
https://stackoverflow.com/questions/73877384/stdis-same-different-results-beween-compilers

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (5 preceding siblings ...)
  2022-09-28 14:32 ` jlame646 at gmail dot com
@ 2022-09-28 15:34 ` mpolacek at gcc dot gnu.org
  2022-09-29 18:24 ` glisse at gcc dot gnu.org
                   ` (12 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2022-09-28 15:34 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nir.livne at gmail dot com

--- Comment #7 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
*** Bug 107070 has been marked as a duplicate of this bug. ***

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (6 preceding siblings ...)
  2022-09-28 15:34 ` mpolacek at gcc dot gnu.org
@ 2022-09-29 18:24 ` glisse at gcc dot gnu.org
  2022-09-29 19:01 ` jakub at gcc dot gnu.org
                   ` (11 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: glisse at gcc dot gnu.org @ 2022-09-29 18:24 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #8 from Marc Glisse <glisse at gcc dot gnu.org> ---
(simplify
  (bit_not (bit_not @0))
  @0)

while in an other place we have

(simplify
 (bit_and @0 integer_all_onesp)
  (non_lvalue @0))

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (7 preceding siblings ...)
  2022-09-29 18:24 ` glisse at gcc dot gnu.org
@ 2022-09-29 19:01 ` jakub at gcc dot gnu.org
  2022-09-30  7:12 ` jakub at gcc dot gnu.org
                   ` (10 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-09-29 19:01 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |jakub at gcc dot gnu.org

--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 53642
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53642&action=edit
gcc13-pr107065.patch

I'd say it is wrong to fold this already during parsing, we should do such
optimizations only during cp_fold* and later.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (8 preceding siblings ...)
  2022-09-29 19:01 ` jakub at gcc dot gnu.org
@ 2022-09-30  7:12 ` jakub at gcc dot gnu.org
  2022-09-30  7:13 ` jakub at gcc dot gnu.org
                   ` (9 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-09-30  7:12 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #53642|0                           |1
        is obsolete|                            |

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 53644
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53644&action=edit
gcc13-pr107065.patch

Unfortunately that patch broke bootstrap, we now get an extra warning in
c-attribs.cc which has a function with nonnull(3) attribute and tests that
parameter against NULL in an assertion.

Fixing that, the patch shows quite a lot of regressions:
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++11  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++11  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++11  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++14  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++14  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++14  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++17  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++17  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++17  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++20  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++20  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++20  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++2b  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++2b  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++2b  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++98  (test for
warnings, line 21)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++98  (test for
warnings, line 22)
+FAIL: c-c++-common/Wlogical-not-parentheses-1.c  -std=gnu++98  (test for
warnings, line 23)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++11  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++11  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++14  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++14  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++17  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++17  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++20  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++20  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++2b  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++2b  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++98  (test for
warnings, line 11)
+FAIL: c-c++-common/Wlogical-not-parentheses-2.c  -std=gnu++98  expected
multiline pattern lines 13-17 not found: "\\s*r \\+= !aaa == bbb;[^\\n\\r]*\\n 
           \\^~\\n   r \\+= !aaa == bbb;[^\\n\\r]*\\n        \\^~~~\\n       
\\(   \\)[^\\n\\r]*\\n"
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++11  (test for
warnings, line 28)
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++14  (test for
warnings, line 28)
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++17  (test for
warnings, line 28)
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++20  (test for
warnings, line 28)
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++2b  (test for
warnings, line 28)
+FAIL: c-c++-common/Wlogical-not-parentheses-3.c  -std=gnu++98  (test for
warnings, line 28)
+XPASS: c-c++-common/pr49706.c  -std=gnu++11  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++11  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++11  (test for warnings, line 98)
+XPASS: c-c++-common/pr49706.c  -std=gnu++14  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++14  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++14  (test for warnings, line 98)
+XPASS: c-c++-common/pr49706.c  -std=gnu++17  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++17  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++17  (test for warnings, line 98)
+XPASS: c-c++-common/pr49706.c  -std=gnu++20  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++20  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++20  (test for warnings, line 98)
+XPASS: c-c++-common/pr49706.c  -std=gnu++2b  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++2b  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++2b  (test for warnings, line 98)
+XPASS: c-c++-common/pr49706.c  -std=gnu++98  (test for bogus messages, line
97)
+XPASS: c-c++-common/pr49706.c  -std=gnu++98  (test for bogus messages, line
99)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 111)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 113)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 129)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 130)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 131)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 132)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 133)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 134)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 152)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 153)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 154)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 155)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 156)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 157)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 175)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 176)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 177)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 178)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 27)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 28)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 29)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 30)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 31)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 32)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 50)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 51)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 52)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 53)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 54)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 55)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 71)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 96)
+FAIL: c-c++-common/pr49706.c  -std=gnu++98  (test for warnings, line 98)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++11  (test for warnings, line 9)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++14  (test for warnings, line 9)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++17  (test for warnings, line 9)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++20  (test for warnings, line 9)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++2b  (test for warnings, line 9)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 11)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 12)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 13)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 14)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 15)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 16)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 17)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 18)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 19)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 20)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 21)
+FAIL: c-c++-common/pr62199.c  -std=gnu++98  (test for warnings, line 9)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++11  (test for warnings, line 31)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++14  (test for warnings, line 31)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++17  (test for warnings, line 31)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++20  (test for warnings, line 31)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++2b  (test for warnings, line 31)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 17)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 18)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 24)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 25)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 26)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 27)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 28)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 29)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 30)
+FAIL: c-c++-common/pr65120.c  -std=gnu++98  (test for warnings, line 31)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++11 bogus sequence point warning
(test for bogus messages, line 69)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++14 bogus sequence point warning
(test for bogus messages, line 69)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++17 bogus sequence point warning
(test for bogus messages, line 69)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++20 bogus sequence point warning
(test for bogus messages, line 69)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++2b bogus sequence point warning
(test for bogus messages, line 69)
+FAIL: g++.dg/warn/sequence-pt-1.C  -std=gnu++98 bogus sequence point warning
(test for bogus messages, line 69)
so not really sure what to do :(.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (9 preceding siblings ...)
  2022-09-30  7:12 ` jakub at gcc dot gnu.org
@ 2022-09-30  7:13 ` jakub at gcc dot gnu.org
  2022-09-30  8:03 ` glisse at gcc dot gnu.org
                   ` (8 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-09-30  7:13 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|jakub at gcc dot gnu.org           |unassigned at gcc dot gnu.org
             Status|ASSIGNED                    |NEW

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (10 preceding siblings ...)
  2022-09-30  7:13 ` jakub at gcc dot gnu.org
@ 2022-09-30  8:03 ` glisse at gcc dot gnu.org
  2022-09-30  8:27 ` jakub at gcc dot gnu.org
                   ` (7 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: glisse at gcc dot gnu.org @ 2022-09-30  8:03 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #11 from Marc Glisse <glisse at gcc dot gnu.org> ---
Did you try adding "non_lvalue" in match.pd? It looks less intrusive. Although
in the long term your approach seems better and the failures should be fixable.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (11 preceding siblings ...)
  2022-09-30  8:03 ` glisse at gcc dot gnu.org
@ 2022-09-30  8:27 ` jakub at gcc dot gnu.org
  2022-09-30  8:47 ` glisse at gcc dot gnu.org
                   ` (6 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-09-30  8:27 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |jason at gcc dot gnu.org

--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Guess one possibility would be to teach the warning code to look through
TRUTH_NOT_EXPR around stuff.
Or we could at least temporarily invert_truthvalue_loc if arg is tcc_comparison
or some similar special case.
Or similarly we could (for the time being) always invert_truthvalue_loc, but if
the lvalue_kind of arg and val changes wrap it in NON_LVALUE_EXPR.
Doing it on the match.pd side doesn't look right, there could be many other
optimizations that result in something similar.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (12 preceding siblings ...)
  2022-09-30  8:27 ` jakub at gcc dot gnu.org
@ 2022-09-30  8:47 ` glisse at gcc dot gnu.org
  2022-12-15 18:18 ` cvs-commit at gcc dot gnu.org
                   ` (5 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: glisse at gcc dot gnu.org @ 2022-09-30  8:47 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #13 from Marc Glisse <glisse at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #12)
> Doing it on the match.pd side doesn't look right, there could be many other
> optimizations that result in something similar.

$ grep -c non_lvalue match.pd   
12

probably they should be removed and those that were useful should be fixed by
similar techniques as you are considering...

To add one more option to your list, maybe the generic-simplify machinery could
add non_lvalue automatically in some cases? I still prefer your first option
though, tweaking the warning code, which probably expected x!=0 and now gets
!(x==0) or something similar.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (13 preceding siblings ...)
  2022-09-30  8:47 ` glisse at gcc dot gnu.org
@ 2022-12-15 18:18 ` cvs-commit at gcc dot gnu.org
  2022-12-16  9:23 ` jakub at gcc dot gnu.org
                   ` (4 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2022-12-15 18:18 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #14 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:8b775b4c48a3cc4ef5c50e56144aea02da2e9cc6

commit r13-4726-g8b775b4c48a3cc4ef5c50e56144aea02da2e9cc6
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 15 19:17:45 2022 +0100

    c++: Ensure !!var is not an lvalue [PR107065]

    The TRUTH_NOT_EXPR case in cp_build_unary_op is one of the spots where
    we somewhat fold immediately using invert_truthvalue_loc.
    I've tried using
      return build1_loc (location, TRUTH_NOT_EXPR, boolean_type_node, arg);
    in there instead, but unfortunately that regressed
    Wlogical-not-parentheses-*.c pr49706.c pr62199.c pr65120.c sequence-pt-1.C
    tests, so at least for backporting that doesn't seem to be a way to go.

    So, this patch instead wraps it into NON_LVALUE_EXPR if needed (which also
    need a tweak for some tests in the pr47906.c test, but nothing major),
    with the intent to make it backportable, and later I'll try to do further
    steps to avoid folding here prematurely.  Most of the problems with
    build1 TRUTH_NOT_EXPR are that it doesn't even invert comparisons as most
    common case and lots of warning code isn't able to deal with ! around
    comparisons; so perhaps one way to do this would be fold by hand only
    invertable comparisons and for the rest create TRUTH_NOT_EXPR.

    2022-12-15  Jakub Jelinek  <jakub@redhat.com>

            PR c++/107065
    gcc/cp/
            * typeck.cc (cp_build_unary_op) <case TRUTH_NOT_EXPR>: If
            invert_truthvalue_loc returns obvalue_p, wrap it into
NON_LVALUE_EXPR.
            * parser.cc (cp_parser_binary_expression): Don't call
            warn_logical_not_parentheses if current.lhs is a NON_LVALUE_EXPR
            of a decl with boolean type.
    gcc/testsuite/
            * g++.dg/cpp0x/pr107065.C: New test.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (14 preceding siblings ...)
  2022-12-15 18:18 ` cvs-commit at gcc dot gnu.org
@ 2022-12-16  9:23 ` jakub at gcc dot gnu.org
  2023-02-10 17:44 ` cvs-commit at gcc dot gnu.org
                   ` (3 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-12-16  9:23 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #15 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Fixed on the trunk so far.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (15 preceding siblings ...)
  2022-12-16  9:23 ` jakub at gcc dot gnu.org
@ 2023-02-10 17:44 ` cvs-commit at gcc dot gnu.org
  2023-05-02 20:12 ` cvs-commit at gcc dot gnu.org
                   ` (2 subsequent siblings)
  19 siblings, 0 replies; 21+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-02-10 17:44 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #16 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-12 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:bc1ee711eeab4b0d55463cd153747d30c69225c7

commit r12-9127-gbc1ee711eeab4b0d55463cd153747d30c69225c7
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 15 19:17:45 2022 +0100

    c++: Ensure !!var is not an lvalue [PR107065]

    The TRUTH_NOT_EXPR case in cp_build_unary_op is one of the spots where
    we somewhat fold immediately using invert_truthvalue_loc.
    I've tried using
      return build1_loc (location, TRUTH_NOT_EXPR, boolean_type_node, arg);
    in there instead, but unfortunately that regressed
    Wlogical-not-parentheses-*.c pr49706.c pr62199.c pr65120.c sequence-pt-1.C
    tests, so at least for backporting that doesn't seem to be a way to go.

    So, this patch instead wraps it into NON_LVALUE_EXPR if needed (which also
    need a tweak for some tests in the pr47906.c test, but nothing major),
    with the intent to make it backportable, and later I'll try to do further
    steps to avoid folding here prematurely.  Most of the problems with
    build1 TRUTH_NOT_EXPR are that it doesn't even invert comparisons as most
    common case and lots of warning code isn't able to deal with ! around
    comparisons; so perhaps one way to do this would be fold by hand only
    invertable comparisons and for the rest create TRUTH_NOT_EXPR.

    2022-12-15  Jakub Jelinek  <jakub@redhat.com>

            PR c++/107065
    gcc/cp/
            * typeck.cc (cp_build_unary_op) <case TRUTH_NOT_EXPR>: If
            invert_truthvalue_loc returns obvalue_p, wrap it into
NON_LVALUE_EXPR.
            * parser.cc (cp_parser_binary_expression): Don't call
            warn_logical_not_parentheses if current.lhs is a NON_LVALUE_EXPR
            of a decl with boolean type.
    gcc/testsuite/
            * g++.dg/cpp0x/pr107065.C: New test.

    (cherry picked from commit 8b775b4c48a3cc4ef5c50e56144aea02da2e9cc6)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (16 preceding siblings ...)
  2023-02-10 17:44 ` cvs-commit at gcc dot gnu.org
@ 2023-05-02 20:12 ` cvs-commit at gcc dot gnu.org
  2023-05-03 15:19 ` cvs-commit at gcc dot gnu.org
  2023-05-04  7:20 ` jakub at gcc dot gnu.org
  19 siblings, 0 replies; 21+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-05-02 20:12 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #17 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:200854895c55ec999f38fce9086e711173a4a01a

commit r11-10689-g200854895c55ec999f38fce9086e711173a4a01a
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 15 19:17:45 2022 +0100

    c++: Ensure !!var is not an lvalue [PR107065]

    The TRUTH_NOT_EXPR case in cp_build_unary_op is one of the spots where
    we somewhat fold immediately using invert_truthvalue_loc.
    I've tried using
      return build1_loc (location, TRUTH_NOT_EXPR, boolean_type_node, arg);
    in there instead, but unfortunately that regressed
    Wlogical-not-parentheses-*.c pr49706.c pr62199.c pr65120.c sequence-pt-1.C
    tests, so at least for backporting that doesn't seem to be a way to go.

    So, this patch instead wraps it into NON_LVALUE_EXPR if needed (which also
    need a tweak for some tests in the pr47906.c test, but nothing major),
    with the intent to make it backportable, and later I'll try to do further
    steps to avoid folding here prematurely.  Most of the problems with
    build1 TRUTH_NOT_EXPR are that it doesn't even invert comparisons as most
    common case and lots of warning code isn't able to deal with ! around
    comparisons; so perhaps one way to do this would be fold by hand only
    invertable comparisons and for the rest create TRUTH_NOT_EXPR.

    2022-12-15  Jakub Jelinek  <jakub@redhat.com>

            PR c++/107065
    gcc/cp/
            * typeck.c (cp_build_unary_op) <case TRUTH_NOT_EXPR>: If
            invert_truthvalue_loc returns obvalue_p, wrap it into
NON_LVALUE_EXPR.
            * parser.c (cp_parser_binary_expression): Don't call
            warn_logical_not_parentheses if current.lhs is a NON_LVALUE_EXPR
            of a decl with boolean type.
    gcc/testsuite/
            * g++.dg/cpp0x/pr107065.C: New test.

    (cherry picked from commit 8b775b4c48a3cc4ef5c50e56144aea02da2e9cc6)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (17 preceding siblings ...)
  2023-05-02 20:12 ` cvs-commit at gcc dot gnu.org
@ 2023-05-03 15:19 ` cvs-commit at gcc dot gnu.org
  2023-05-04  7:20 ` jakub at gcc dot gnu.org
  19 siblings, 0 replies; 21+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-05-03 15:19 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

--- Comment #18 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:52921a6c7249ac5d0aa58231ae45997bebd2bc67

commit r10-11347-g52921a6c7249ac5d0aa58231ae45997bebd2bc67
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 15 19:17:45 2022 +0100

    c++: Ensure !!var is not an lvalue [PR107065]

    The TRUTH_NOT_EXPR case in cp_build_unary_op is one of the spots where
    we somewhat fold immediately using invert_truthvalue_loc.
    I've tried using
      return build1_loc (location, TRUTH_NOT_EXPR, boolean_type_node, arg);
    in there instead, but unfortunately that regressed
    Wlogical-not-parentheses-*.c pr49706.c pr62199.c pr65120.c sequence-pt-1.C
    tests, so at least for backporting that doesn't seem to be a way to go.

    So, this patch instead wraps it into NON_LVALUE_EXPR if needed (which also
    need a tweak for some tests in the pr47906.c test, but nothing major),
    with the intent to make it backportable, and later I'll try to do further
    steps to avoid folding here prematurely.  Most of the problems with
    build1 TRUTH_NOT_EXPR are that it doesn't even invert comparisons as most
    common case and lots of warning code isn't able to deal with ! around
    comparisons; so perhaps one way to do this would be fold by hand only
    invertable comparisons and for the rest create TRUTH_NOT_EXPR.

    2022-12-15  Jakub Jelinek  <jakub@redhat.com>

            PR c++/107065
    gcc/cp/
            * typeck.c (cp_build_unary_op) <case TRUTH_NOT_EXPR>: If
            invert_truthvalue_loc returns obvalue_p, wrap it into
NON_LVALUE_EXPR.
            * parser.c (cp_parser_binary_expression): Don't call
            warn_logical_not_parentheses if current.lhs is a NON_LVALUE_EXPR
            of a decl with boolean type.
    gcc/testsuite/
            * g++.dg/cpp0x/pr107065.C: New test.

    (cherry picked from commit 8b775b4c48a3cc4ef5c50e56144aea02da2e9cc6)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Bug c++/107065] GCC treats rvalue as an lvalue
  2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
                   ` (18 preceding siblings ...)
  2023-05-03 15:19 ` cvs-commit at gcc dot gnu.org
@ 2023-05-04  7:20 ` jakub at gcc dot gnu.org
  19 siblings, 0 replies; 21+ messages in thread
From: jakub at gcc dot gnu.org @ 2023-05-04  7:20 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107065

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED

--- Comment #19 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Fixed for 10.5 too.

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2023-05-04  7:20 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-28  7:35 [Bug c++/107065] New: GCC treats rvalue like lvalue jlame646 at gmail dot com
2022-09-28 12:00 ` [Bug c++/107065] GCC treats rvalue as an lvalue redi at gcc dot gnu.org
2022-09-28 12:06 ` jlame646 at gmail dot com
2022-09-28 12:09 ` jlame646 at gmail dot com
2022-09-28 12:50 ` redi at gcc dot gnu.org
2022-09-28 13:41 ` mpolacek at gcc dot gnu.org
2022-09-28 14:32 ` jlame646 at gmail dot com
2022-09-28 15:34 ` mpolacek at gcc dot gnu.org
2022-09-29 18:24 ` glisse at gcc dot gnu.org
2022-09-29 19:01 ` jakub at gcc dot gnu.org
2022-09-30  7:12 ` jakub at gcc dot gnu.org
2022-09-30  7:13 ` jakub at gcc dot gnu.org
2022-09-30  8:03 ` glisse at gcc dot gnu.org
2022-09-30  8:27 ` jakub at gcc dot gnu.org
2022-09-30  8:47 ` glisse at gcc dot gnu.org
2022-12-15 18:18 ` cvs-commit at gcc dot gnu.org
2022-12-16  9:23 ` jakub at gcc dot gnu.org
2023-02-10 17:44 ` cvs-commit at gcc dot gnu.org
2023-05-02 20:12 ` cvs-commit at gcc dot gnu.org
2023-05-03 15:19 ` cvs-commit at gcc dot gnu.org
2023-05-04  7:20 ` jakub at gcc dot gnu.org

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).