| // PR c++/20280 |
| |
| // { dg-do compile } |
| |
| // Gimplification of the COND_EXPR used to fail because it had an |
| // addressable type, and create_tmp_var rejected that. |
| |
| struct A |
| { |
| ~A(); |
| }; |
| |
| struct B : A {}; |
| |
| A& foo(); |
| |
| void bar(bool b) |
| { |
| (B&) (b ? foo() : foo()); |
| } |
| |
| // Make sure bit-fields and addressable types don't cause crashes. |
| // These were not in the original bug report. |
| |
| // Added by Alexandre Oliva <aoliva@redhat.com> |
| |
| // Copyright 2005 Free Software Foundation |
| |
| struct X |
| { |
| long i : 32, j, k : 32; |
| }; |
| |
| void g(long&); |
| void h(const long&); |
| |
| void f(X &x, bool b) |
| { |
| (b ? x.i : x.j) = 1; |
| (b ? x.j : x.k) = 2; |
| (b ? x.i : x.k) = 3; |
| |
| (void)(b ? x.i : x.j); |
| (void)(b ? x.i : x.k); |
| (void)(b ? x.j : x.k); |
| |
| g (b ? x.i : x.j); // { dg-error "cannot bind bit-field" } |
| g (b ? x.i : x.k); // { dg-error "cannot bind bit-field" } |
| g (b ? x.j : x.k); // { dg-error "cannot bind bit-field" } |
| |
| // It's not entirely clear whether these should be accepted. The |
| // conditional expressions are lvalues for sure, and 8.5.3/5 exempts |
| // lvalues for bit-fields, but it's not clear that conditional |
| // expressions that are lvalues and that have at least one possible |
| // result that is a bit-field lvalue meets this condition. |
| h (b ? x.i : x.j); |
| h (b ? x.i : x.k); |
| h (b ? x.j : x.k); |
| |
| (long &)(b ? x.i : x.j); // { dg-error "18:attempt to take address of bit-field" } |
| (long &)(b ? x.i : x.k); // { dg-error "18:attempt to take address of bit-field" } |
| // { dg-error "24:attempt to take address of bit-field" "" { target *-*-* } .-1 } |
| (long &)(b ? x.j : x.k); // { dg-error "24:attempt to take address of bit-field" } |
| } |