104 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RUN: %clang_cc1 -std=c++1y -fblocks -fsyntax-only -verify %s
 | |
| // PR16946
 | |
| // expected-no-diagnostics
 | |
| 
 | |
| auto foo() {
 | |
|   static_assert(sizeof(__func__) == 4, "foo");
 | |
|   static_assert(sizeof(__FUNCTION__) == 4, "foo");
 | |
|   static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "auto foo()");
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| auto bar() -> decltype(42) {
 | |
|   static_assert(sizeof(__func__) == 4, "bar");
 | |
|   static_assert(sizeof(__FUNCTION__) == 4, "bar");
 | |
|   static_assert(sizeof(__PRETTY_FUNCTION__) == 10, "int bar()");
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| // Within templates.
 | |
| template <typename T>
 | |
| int baz() {
 | |
|   static_assert(sizeof(__func__) == 4, "baz");
 | |
|   static_assert(sizeof(__FUNCTION__) == 4, "baz");
 | |
|   static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
 | |
| 
 | |
|   []() {
 | |
|     static_assert(sizeof(__func__) == 11, "operator()");
 | |
|     static_assert(sizeof(__FUNCTION__) == 11, "operator()");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 50,
 | |
|                   "auto baz()::<anonymous class>::operator()() const");
 | |
|     return 0;
 | |
|   }
 | |
|   ();
 | |
| 
 | |
|   ^{
 | |
|     // FIXME: This is obviously wrong.
 | |
|     static_assert(sizeof(__func__) == 1, "__baz_block_invoke");
 | |
|     static_assert(sizeof(__FUNCTION__) == 1, "__baz_block_invoke");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__baz_block_invoke");
 | |
|   }
 | |
|   ();
 | |
| 
 | |
|   #pragma clang __debug captured
 | |
|   {
 | |
|     static_assert(sizeof(__func__) == 4, "baz");
 | |
|     static_assert(sizeof(__FUNCTION__) == 4, "baz");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
 | |
|   }
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|   static_assert(sizeof(__func__) == 5, "main");
 | |
|   static_assert(sizeof(__FUNCTION__) == 5, "main");
 | |
|   static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
 | |
| 
 | |
|   []() {
 | |
|     static_assert(sizeof(__func__) == 11, "operator()");
 | |
|     static_assert(sizeof(__FUNCTION__) == 11, "operator()");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
 | |
|                   "auto main()::<anonymous class>::operator()() const");
 | |
|     return 0;
 | |
|   }
 | |
|   ();
 | |
| 
 | |
|   ^{
 | |
|     // FIXME: This is obviously wrong.
 | |
|     static_assert(sizeof(__func__) == 1, "__main_block_invoke");
 | |
|     static_assert(sizeof(__FUNCTION__) == 1, "__main_block_invoke");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__main_block_invoke");
 | |
|   }
 | |
|   ();
 | |
| 
 | |
|   #pragma clang __debug captured
 | |
|   {
 | |
|     static_assert(sizeof(__func__) == 5, "main");
 | |
|     static_assert(sizeof(__FUNCTION__) == 5, "main");
 | |
|     static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
 | |
| 
 | |
|     #pragma clang __debug captured
 | |
|     {
 | |
|       static_assert(sizeof(__func__) == 5, "main");
 | |
|       static_assert(sizeof(__FUNCTION__) == 5, "main");
 | |
|       static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   []() {
 | |
|     #pragma clang __debug captured
 | |
|     {
 | |
|       static_assert(sizeof(__func__) == 11, "operator()");
 | |
|       static_assert(sizeof(__FUNCTION__) == 11, "operator()");
 | |
|       static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
 | |
|                     "auto main()::<anonymous class>::operator()() const");
 | |
|     }
 | |
|   }
 | |
|   ();
 | |
| 
 | |
|   baz<int>();
 | |
| 
 | |
|   return 0;
 | |
| }
 | 
