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