xref: /aosp_15_r20/external/clang/test/SemaCXX/predefined-expr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -x c++ -std=c++1y -fblocks -fsyntax-only -triple %itanium_abi_triple -verify %s
2*67e74705SXin Li // PR16946
3*67e74705SXin Li // expected-no-diagnostics
4*67e74705SXin Li 
foo()5*67e74705SXin Li auto foo() {
6*67e74705SXin Li   static_assert(sizeof(__func__) == 4, "foo");
7*67e74705SXin Li   static_assert(sizeof(__FUNCTION__) == 4, "foo");
8*67e74705SXin Li   static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "auto foo()");
9*67e74705SXin Li   return 0;
10*67e74705SXin Li }
11*67e74705SXin Li 
bar()12*67e74705SXin Li auto bar() -> decltype(42) {
13*67e74705SXin Li   static_assert(sizeof(__func__) == 4, "bar");
14*67e74705SXin Li   static_assert(sizeof(__FUNCTION__) == 4, "bar");
15*67e74705SXin Li   static_assert(sizeof(__PRETTY_FUNCTION__) == 10, "int bar()");
16*67e74705SXin Li   return 0;
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li // Within templates.
20*67e74705SXin Li template <typename T>
baz()21*67e74705SXin Li int baz() {
22*67e74705SXin Li   static_assert(sizeof(__func__) == 4, "baz");
23*67e74705SXin Li   static_assert(sizeof(__FUNCTION__) == 4, "baz");
24*67e74705SXin Li   static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
25*67e74705SXin Li 
26*67e74705SXin Li   []() {
27*67e74705SXin Li     static_assert(sizeof(__func__) == 11, "operator()");
28*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 11, "operator()");
29*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 50,
30*67e74705SXin Li                   "auto baz()::<anonymous class>::operator()() const");
31*67e74705SXin Li     return 0;
32*67e74705SXin Li   }
33*67e74705SXin Li   ();
34*67e74705SXin Li 
35*67e74705SXin Li   ^{
36*67e74705SXin Li     static_assert(sizeof(__func__) == 27, "___Z3bazIiEiv_block_invoke");
37*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 27, "___Z3bazIiEiv_block_invoke");
38*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 27, "___Z3bazIiEiv_block_invoke");
39*67e74705SXin Li   }
40*67e74705SXin Li   ();
41*67e74705SXin Li 
42*67e74705SXin Li   #pragma clang __debug captured
43*67e74705SXin Li   {
44*67e74705SXin Li     static_assert(sizeof(__func__) == 4, "baz");
45*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 4, "baz");
46*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
47*67e74705SXin Li   }
48*67e74705SXin Li 
49*67e74705SXin Li   return 0;
50*67e74705SXin Li }
51*67e74705SXin Li 
main()52*67e74705SXin Li int main() {
53*67e74705SXin Li   static_assert(sizeof(__func__) == 5, "main");
54*67e74705SXin Li   static_assert(sizeof(__FUNCTION__) == 5, "main");
55*67e74705SXin Li   static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
56*67e74705SXin Li 
57*67e74705SXin Li   []() {
58*67e74705SXin Li     static_assert(sizeof(__func__) == 11, "operator()");
59*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 11, "operator()");
60*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
61*67e74705SXin Li                   "auto main()::<anonymous class>::operator()() const");
62*67e74705SXin Li     return 0;
63*67e74705SXin Li   }
64*67e74705SXin Li   ();
65*67e74705SXin Li 
66*67e74705SXin Li   ^{
67*67e74705SXin Li     static_assert(sizeof(__func__) == 20, "__main_block_invoke");
68*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 20, "__main_block_invoke");
69*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "__main_block_invoke");
70*67e74705SXin Li   }
71*67e74705SXin Li   ();
72*67e74705SXin Li 
73*67e74705SXin Li   #pragma clang __debug captured
74*67e74705SXin Li   {
75*67e74705SXin Li     static_assert(sizeof(__func__) == 5, "main");
76*67e74705SXin Li     static_assert(sizeof(__FUNCTION__) == 5, "main");
77*67e74705SXin Li     static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
78*67e74705SXin Li 
79*67e74705SXin Li     #pragma clang __debug captured
80*67e74705SXin Li     {
81*67e74705SXin Li       static_assert(sizeof(__func__) == 5, "main");
82*67e74705SXin Li       static_assert(sizeof(__FUNCTION__) == 5, "main");
83*67e74705SXin Li       static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
84*67e74705SXin Li     }
85*67e74705SXin Li   }
86*67e74705SXin Li 
87*67e74705SXin Li   []() {
88*67e74705SXin Li     #pragma clang __debug captured
89*67e74705SXin Li     {
90*67e74705SXin Li       static_assert(sizeof(__func__) == 11, "operator()");
91*67e74705SXin Li       static_assert(sizeof(__FUNCTION__) == 11, "operator()");
92*67e74705SXin Li       static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
93*67e74705SXin Li                     "auto main()::<anonymous class>::operator()() const");
94*67e74705SXin Li     }
95*67e74705SXin Li   }
96*67e74705SXin Li   ();
97*67e74705SXin Li 
98*67e74705SXin Li   baz<int>();
99*67e74705SXin Li 
100*67e74705SXin Li   return 0;
101*67e74705SXin Li }
102