-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Clang] Implement P2738R1 - constexpr cast from void*
Reviewed By: #clang-language-wg, erichkeane Differential Revision: https://reviews.llvm.org/D153702
- Loading branch information
Showing
7 changed files
with
64 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// RUN: %clang_cc1 -fsyntax-only -std=c++2c -verify=expected,cxx26 %s | ||
// RUN: %clang_cc1 -fsyntax-only -std=c++2b -verify=expected=cxx23 %s | ||
|
||
|
||
struct S {}; | ||
struct T : S {} t; | ||
|
||
consteval void test() { // cxx23-error{{consteval function never produces a constant expression}} | ||
void* a = &t; | ||
const void* b = &t; | ||
volatile void* c = &t; | ||
(void)static_cast<T*>(a); //cxx23-note {{cast from 'void *' is not allowed in a constant expression in C++ standards before C++2c}} | ||
(void)static_cast<const T*>(a); | ||
(void)static_cast<volatile T*>(a); | ||
|
||
(void)(T*)(a); | ||
(void)(const T*)(a); | ||
(void)(volatile T*)(a); | ||
|
||
(void)static_cast<T*>(b); // expected-error {{static_cast from 'const void *' to 'T *' casts away qualifiers}} | ||
(void)static_cast<volatile T*>(b); // expected-error {{static_cast from 'const void *' to 'volatile T *' casts away qualifiers}} | ||
(void)static_cast<const T*>(b); | ||
(void)static_cast<volatile const T*>(b); | ||
|
||
(void)static_cast<T*>(c); // expected-error{{static_cast from 'volatile void *' to 'T *' casts away qualifiers}} | ||
(void)static_cast<volatile T*>(c); | ||
(void)static_cast<const T*>(b); | ||
(void)static_cast<volatile const T*>(b); | ||
} | ||
|
||
void err() { | ||
constexpr void* a = &t; | ||
constexpr auto err1 = static_cast<int*>(a); // expected-error{{constexpr variable 'err1' must be initialized by a constant expression}} \ | ||
// cxx23-note {{cast from 'void *' is not allowed in a constant expression in C++ standards before C++2c}} \ | ||
// cxx26-note {{cast from 'void *' is not allowed in a constant expression because the pointed object type 'T' is not similar to the target type 'int'}} | ||
constexpr auto err2 = static_cast<S*>(a); // expected-error{{constexpr variable 'err2' must be initialized by a constant expression}} \ | ||
// cxx23-note {{cast from 'void *' is not allowed in a constant expression in C++ standards before C++2c}} \ | ||
// cxx26-note {{cast from 'void *' is not allowed in a constant expression because the pointed object type 'T' is not similar to the target type 'S'}} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters