// RUN: %clang_cc1 -std=c++23 -fsyntax-only -Wno-unused %s -verify=cxx20-cxx26 // RUN: %clang_cc1 -std=c++20 -fsyntax-only -Wno-unused %s -verify=cxx20,cxx20-cxx26 // RUN: %clang_cc1 -std=c++17 -fsyntax-only -Wno-unused %s -verify=precxx20,cxx11-cxx17 // RUN: %clang_cc1 -std=c++14 -fsyntax-only -Wno-unused %s -verify=precxx20,cxx11-cxx17 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wno-unused %s -verify=precxx20,cxx11-cxx17 // RUN: %clang_cc1 -std=c++03 -fsyntax-only -Wno-unused %s -verify=precxx20 // RUN: %clang_cc1 -std=c++98 -fsyntax-only -Wno-unused %s -verify=precxx20 // RUN: %clang_cc1 -x c -std=c23 -fsyntax-only -Wno-unused %s -verify=c #if __has_builtin(__builtin_is_within_lifetime) #error has the builtin #else #error does not have the builtin #endif // cxx20-cxx26-error@-4 {{has the builtin}} // precxx20-error@-3 {{does not have the builtin}} // c-error@-4 {{does not have the builtin}} #if __has_constexpr_builtin(__builtin_is_within_lifetime) #error has the constexpr builtin #else #error does not have the constexpr builtin #endif // cxx20-cxx26-error@-4 {{has the constexpr builtin}} // precxx20-error@-3 {{does not have the constexpr builtin}} // c-error@-4 {{does not have the constexpr builtin}} #if __cplusplus < 201103L #define static_assert __extension__ _Static_assert #define CONSTEXPR11 #else #define CONSTEXPR11 constexpr #endif static const int i1 = 0; static_assert(__builtin_is_within_lifetime(&i1), ""); // precxx20-error@-1 {{use of undeclared identifier '__builtin_is_within_lifetime'}} // c-error@-2 {{use of undeclared identifier '__builtin_is_within_lifetime'}} #if !defined(__cplusplus) || __cplusplus >= 201102L constexpr int i2 = 0; static_assert(__builtin_is_within_lifetime(&i2), ""); // cxx11-cxx17-error@-1 {{use of undeclared identifier '__builtin_is_within_lifetime'}} // c-error@-2 {{use of undeclared identifier '__builtin_is_within_lifetime'}} #endif #ifdef __cplusplus template CONSTEXPR11 bool f1(T i) { // #f1 return __builtin_is_within_lifetime(&i); // #f1-consteval-call } bool(&fp1)(int) = f1; // cxx20-cxx26-error@-1 {{cannot take address of immediate function 'f1' outside of an immediate invocation}} // cxx20-cxx26-note@#f1 {{declared here}} // cxx20-cxx26-note@#f1-consteval-call {{'f1' is an immediate function because its body contains a call to a consteval function '__builtin_is_within_lifetime' and that call is not a constant expression}} // precxx20-error@#f1-consteval-call {{use of undeclared identifier '__builtin_is_within_lifetime'}} // precxx20-note@-5 {{in instantiation of function template specialization 'f1' requested here}} #else void f1(int i) { __builtin_is_within_lifetime(&i); // c-error@-1 {{use of undeclared identifier '__builtin_is_within_lifetime'}} } #endif #if __cplusplus >= 202002L constexpr void f2() { int i = 0; if consteval { // cxx20-warning {{consteval if}} __builtin_is_within_lifetime(&i); } } void(&fp2)() = f2; constexpr void f3() { __builtin_is_within_lifetime(&i1); } void(&fp3)() = f3; constexpr void f4() { &__builtin_is_within_lifetime; // cxx20-cxx26-error@-1 {{builtin functions must be directly called}} // cxx20-cxx26-error@-2 {{cannot take address of consteval function '__builtin_is_within_lifetime' outside of an immediate invocation}} __builtin_is_within_lifetime(); // cxx20-cxx26-error@-1 {{too few arguments to function call, expected 1, have 0}} // cxx20-cxx26-error@-2 {{cannot take address of consteval function '__builtin_is_within_lifetime' outside of an immediate invocation}} int* not_constexpr; __builtin_is_within_lifetime(not_constexpr); // cxx20-cxx26-error@-1 {{call to consteval function '__builtin_is_within_lifetime' is not a constant expression}} // cxx20-cxx26-note@-2 {{read of non-constexpr variable 'not_constexpr' is not allowed in a constant expression}} // cxx20-cxx26-note@-4 {{declared here}} } #endif