forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			35 lines
		
	
	
		
			1008 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1008 B
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fno-modules-error-recovery -fno-spell-checking -verify -std=c++17 %s
 | |
| 
 | |
| #pragma clang module build a
 | |
| module a {}
 | |
| #pragma clang module contents
 | |
| #pragma clang module begin a
 | |
| constexpr bool return_true() { return true; }
 | |
| struct X {
 | |
|   static void f() noexcept(return_true());
 | |
| };
 | |
| #pragma clang module end
 | |
| #pragma clang module endbuild
 | |
| 
 | |
| #pragma clang module build b
 | |
| module b {}
 | |
| #pragma clang module contents
 | |
| #pragma clang module begin b
 | |
| #pragma clang module import a
 | |
| using T = decltype(return_true() && noexcept(X::f()));
 | |
| #pragma clang module end
 | |
| #pragma clang module endbuild
 | |
| 
 | |
| #pragma clang module import a
 | |
| #pragma clang module import b
 | |
| 
 | |
| // Trigger import of return_true and then X::f in the same pass. This causes
 | |
| // the type of X::f to be loaded while we have a pending body for return_true,
 | |
| // which means evaluation of its exception specification at that point would
 | |
| // fail.
 | |
| T t;
 | |
| 
 | |
| static_assert(noexcept(X().f()));
 | |
| 
 | |
| // expected-no-diagnostics
 |