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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |11.5
   Last reconfirmed|                            |2023-08-26
            Summary|ICE on assigning volatile   |[11/12/13/14 Regression]
                   |through ternary operator    |ICE on assigning volatile
                   |                            |through ternary operator
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
      Known to work|                            |5.1.0
      Known to fail|                            |6.1.0
           Keywords|                            |ice-on-invalid-code

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
GCC 5.1.0 and before for C++11:
<source>: In function 'void the_func()':
<source>:6:19: error: ambiguous overload for 'operator=' (operand types are
'TheClass' and 'volatile TheClass')
   (false ? x : x) = y;
                   ^
<source>:2:8: note: candidate: TheClass& TheClass::operator=(const TheClass&)
<near match>
 struct TheClass {};
        ^
<source>:2:8: note:   conversion of argument 1 would be ill-formed:
<source>:6:19: error: binding 'volatile TheClass' to reference of type 'const
TheClass&' discards qualifiers
   (false ? x : x) = y;
                   ^
<source>:2:8: note: candidate: TheClass& TheClass::operator=(TheClass&&) <near
match>
 struct TheClass {};
        ^
<source>:2:8: note:   conversion of argument 1 would be ill-formed:
<source>:6:19: error: cannot bind 'volatile TheClass' lvalue to 'TheClass&&'
   (false ? x : x) = y;
                   ^

For C++98:
<source>: In function 'void the_func()':
<source>:6:19: error: binding 'volatile TheClass' to reference of type 'const
TheClass&' discards qualifiers
   (false ? x : x) = y;
                   ^
<source>:2:8: note:   initializing argument 1 of 'TheClass&
TheClass::operator=(const TheClass&)'
 struct TheClass {};
        ^

Confirmed. this is invalid code.

Reply via email to