mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 21:16:05 +00:00

Previously we only have an extension that warn void pointer deferencing in C++, but for C we did nothing. C2x 6.5.3.2p4 says The unary * operator denotes indirection. If it points to an object, the result is an lvalue designating the object. However, there is no way to form an lvalue designating an object of an incomplete type as 6.3.2.1p1 says "an lvalue is an expression (with an object type other than void)", so the behavior is undefined. Fixes https://github.com/llvm/llvm-project/issues/53631 Signed-off-by: Jun Zhang <jun@junz.org> Differential Revision: https://reviews.llvm.org/D134461
46 lines
716 B
C
46 lines
716 B
C
/* RUN: %clang_cc1 -fsyntax-only -verify -std=c90 -pedantic %s
|
|
*/
|
|
void
|
|
foo (void)
|
|
{
|
|
struct b;
|
|
struct b* x = 0;
|
|
struct b* y = &*x;
|
|
}
|
|
|
|
void foo2 (void)
|
|
{
|
|
typedef int (*arrayptr)[];
|
|
arrayptr x = 0;
|
|
arrayptr y = &*x;
|
|
}
|
|
|
|
void foo3 (void)
|
|
{
|
|
void* x = 0;
|
|
void* y = &*x; /* expected-warning{{address of an expression of type 'void'}}
|
|
expected-warning {{ISO C does not allow indirection on operand of type 'void *'}} */
|
|
}
|
|
|
|
extern const void cv1;
|
|
|
|
const void *foo4 (void)
|
|
{
|
|
return &cv1;
|
|
}
|
|
|
|
extern void cv2;
|
|
void *foo5 (void)
|
|
{
|
|
return &cv2; /* expected-warning{{address of an expression of type 'void'}} */
|
|
}
|
|
|
|
typedef const void CVT;
|
|
extern CVT cv3;
|
|
|
|
const void *foo6 (void)
|
|
{
|
|
return &cv3;
|
|
}
|
|
|