xref: /aosp_15_r20/external/clang/test/SemaCXX/static-assert.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -triple=x86_64-linux-gnu
2*67e74705SXin Li 
3*67e74705SXin Li int f(); // expected-note {{declared here}}
4*67e74705SXin Li 
5*67e74705SXin Li static_assert(f(), "f"); // expected-error {{static_assert expression is not an integral constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
6*67e74705SXin Li static_assert(true, "true is not false");
7*67e74705SXin Li static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
8*67e74705SXin Li 
g()9*67e74705SXin Li void g() {
10*67e74705SXin Li     static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
11*67e74705SXin Li }
12*67e74705SXin Li 
13*67e74705SXin Li class C {
14*67e74705SXin Li     static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
15*67e74705SXin Li };
16*67e74705SXin Li 
17*67e74705SXin Li template<int N> struct T {
18*67e74705SXin Li     static_assert(N == 2, "N is not 2!"); // expected-error {{static_assert failed "N is not 2!"}}
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li T<1> t1; // expected-note {{in instantiation of template class 'T<1>' requested here}}
22*67e74705SXin Li T<2> t2;
23*67e74705SXin Li 
24*67e74705SXin Li template<typename T> struct S {
25*67e74705SXin Li     static_assert(sizeof(T) > sizeof(char), "Type not big enough!"); // expected-error {{static_assert failed "Type not big enough!"}}
26*67e74705SXin Li };
27*67e74705SXin Li 
28*67e74705SXin Li S<char> s1; // expected-note {{in instantiation of template class 'S<char>' requested here}}
29*67e74705SXin Li S<int> s2;
30*67e74705SXin Li 
31*67e74705SXin Li static_assert(false, L"\xFFFFFFFF"); // expected-error {{static_assert failed L"\xFFFFFFFF"}}
32*67e74705SXin Li static_assert(false, u"\U000317FF"); // expected-error {{static_assert failed u"\U000317FF"}}
33*67e74705SXin Li // FIXME: render this as u8"\u03A9"
34*67e74705SXin Li static_assert(false, u8"Ω"); // expected-error {{static_assert failed u8"\316\251"}}
35*67e74705SXin Li static_assert(false, L"\u1234"); // expected-error {{static_assert failed L"\x1234"}}
36*67e74705SXin Li static_assert(false, L"\x1ff" "0\x123" "fx\xfffff" "goop"); // expected-error {{static_assert failed L"\x1FF""0\x123""fx\xFFFFFgoop"}}
37*67e74705SXin Li 
38*67e74705SXin Li template<typename T> struct AlwaysFails {
39*67e74705SXin Li   // Only give one error here.
40*67e74705SXin Li   static_assert(false, ""); // expected-error {{static_assert failed}}
41*67e74705SXin Li };
42*67e74705SXin Li AlwaysFails<int> alwaysFails;
43*67e74705SXin Li 
44*67e74705SXin Li template<typename T> struct StaticAssertProtected {
45*67e74705SXin Li   static_assert(__is_literal(T), ""); // expected-error {{static_assert failed}}
46*67e74705SXin Li   static constexpr T t = {}; // no error here
47*67e74705SXin Li };
48*67e74705SXin Li struct X { ~X(); };
49*67e74705SXin Li StaticAssertProtected<int> sap1;
50*67e74705SXin Li StaticAssertProtected<X> sap2; // expected-note {{instantiation}}
51*67e74705SXin Li 
52*67e74705SXin Li static_assert(true); // expected-warning {{C++1z extension}}
53*67e74705SXin Li static_assert(false); // expected-error-re {{failed{{$}}}} expected-warning {{extension}}
54