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

Converting a pointer to an integer whose result cannot represented in the integer type is undefined behavior is C and prohibited in C++. C++ already has a diagnostic when casting. This adds a diagnostic for C. Since this diagnostic uses the range of the conversion it also modifies int-to-pointer-cast diagnostic to use a range. Fixes PR8718: No warning on casting between pointer and non-pointer-sized int Differential Revision: https://reviews.llvm.org/D72231
25 lines
716 B
C
25 lines
716 B
C
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-pointer-to-int-cast -Wno-bool-conversion %s
|
|
|
|
typedef __typeof((int*) 0 - (int*) 0) intptr_t;
|
|
|
|
static int f = 10;
|
|
static int b = f; // expected-error {{initializer element is not a compile-time constant}}
|
|
|
|
float r = (float) (intptr_t) &r; // expected-error {{initializer element is not a compile-time constant}}
|
|
intptr_t s = (intptr_t) &s;
|
|
_Bool t = &t;
|
|
|
|
|
|
union bar {
|
|
int i;
|
|
};
|
|
|
|
struct foo {
|
|
short ptr;
|
|
};
|
|
|
|
union bar u[1];
|
|
struct foo x = {(intptr_t) u}; // expected-error {{initializer element is not a compile-time constant}}
|
|
struct foo y = {(char) u}; // expected-error {{initializer element is not a compile-time constant}}
|
|
intptr_t z = (intptr_t) u; // no-error
|