| // RUN: %clang_cc1 -verify -std=c2y %s |
| // RUN: %clang_cc1 -verify -std=c23 %s |
| |
| /* WG14 N3481: Yes |
| * Slay Some Earthly Demons XVI |
| * |
| * It was previously UB to use a non-array lvalue with an incomplete type in a |
| * context which required the value of the object. Clang has always diagnosed |
| * this as an error, except when the incomplete type is void. Then we allow the |
| * dereference, but not for a value computation. |
| */ |
| |
| struct f *p; // expected-note {{forward declaration of 'struct f'}} |
| void g(void) { |
| (void)*p; // expected-error {{incomplete type 'struct f' where a complete type is required}} |
| } |
| |
| void h(void *ptr) { |
| (void)*ptr; // expected-warning {{ISO C does not allow indirection on operand of type 'void *'}} |
| (*ptr)++; /* expected-warning {{ISO C does not allow indirection on operand of type 'void *'}} |
| expected-error {{cannot increment value of type 'void'}} |
| */ |
| } |