1 // RUN: %clang_cc1 -std=c++1y -fblocks -fsyntax-only -verify %s 2 // PR16946 3 // expected-no-diagnostics 4 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 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> 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 // FIXME: This is obviously wrong. 37 static_assert(sizeof(__func__) == 1, "__baz_block_invoke"); 38 static_assert(sizeof(__FUNCTION__) == 1, "__baz_block_invoke"); 39 static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__baz_block_invoke"); 40 } 41 (); 42 43 #pragma clang __debug captured 44 { 45 static_assert(sizeof(__func__) == 4, "baz"); 46 static_assert(sizeof(__FUNCTION__) == 4, "baz"); 47 static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]"); 48 } 49 50 return 0; 51 } 52 53 int main() { 54 static_assert(sizeof(__func__) == 5, "main"); 55 static_assert(sizeof(__FUNCTION__) == 5, "main"); 56 static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()"); 57 58 []() { 59 static_assert(sizeof(__func__) == 11, "operator()"); 60 static_assert(sizeof(__FUNCTION__) == 11, "operator()"); 61 static_assert(sizeof(__PRETTY_FUNCTION__) == 51, 62 "auto main()::<anonymous class>::operator()() const"); 63 return 0; 64 } 65 (); 66 67 ^{ 68 // FIXME: This is obviously wrong. 69 static_assert(sizeof(__func__) == 1, "__main_block_invoke"); 70 static_assert(sizeof(__FUNCTION__) == 1, "__main_block_invoke"); 71 static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__main_block_invoke"); 72 } 73 (); 74 75 #pragma clang __debug captured 76 { 77 static_assert(sizeof(__func__) == 5, "main"); 78 static_assert(sizeof(__FUNCTION__) == 5, "main"); 79 static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()"); 80 81 #pragma clang __debug captured 82 { 83 static_assert(sizeof(__func__) == 5, "main"); 84 static_assert(sizeof(__FUNCTION__) == 5, "main"); 85 static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()"); 86 } 87 } 88 89 []() { 90 #pragma clang __debug captured 91 { 92 static_assert(sizeof(__func__) == 11, "operator()"); 93 static_assert(sizeof(__FUNCTION__) == 11, "operator()"); 94 static_assert(sizeof(__PRETTY_FUNCTION__) == 51, 95 "auto main()::<anonymous class>::operator()() const"); 96 } 97 } 98 (); 99 100 baz<int>(); 101 102 return 0; 103 } 104