forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -std=c++1z %s -verify
 | |
| 
 | |
| namespace std {
 | |
|   template<typename> struct tuple_size;
 | |
|   template<int, typename> struct tuple_element;
 | |
| }
 | |
| 
 | |
| struct Get {
 | |
|   template<int> int get() { return 0; }
 | |
|   operator bool() { return true; }
 | |
| };
 | |
| 
 | |
| namespace std {
 | |
|   template<> struct tuple_size<Get> { static constexpr int value = 1; };
 | |
|   template<> struct tuple_element<0, Get> { using type = int; };
 | |
| }
 | |
| 
 | |
| struct Na {
 | |
|   bool flag;
 | |
|   float data;
 | |
| };
 | |
| 
 | |
| struct Rst {
 | |
|   bool flag;
 | |
|   float data;
 | |
|   explicit operator bool() const {
 | |
|     return flag;
 | |
|   }
 | |
| };
 | |
| 
 | |
| Rst f();
 | |
| Na g();
 | |
| 
 | |
| namespace CondInIf {
 | |
| int h() {
 | |
|   if (auto [ok, d] = f()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     ;
 | |
|   if (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
 | |
|     ;
 | |
|   if (auto [value] = Get()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     return value;
 | |
| }
 | |
| } // namespace CondInIf
 | |
| 
 | |
| namespace CondInWhile {
 | |
| int h() {
 | |
|   while (auto [ok, d] = f()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     ;
 | |
|   while (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
 | |
|     ;
 | |
|   while (auto [value] = Get()) // expected-warning{{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     return value;
 | |
| }
 | |
| } // namespace CondInWhile
 | |
| 
 | |
| namespace CondInFor {
 | |
| int h() {
 | |
|   for (; auto [ok, d] = f();) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     ;
 | |
|   for (; auto [ok, d] = g();) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
 | |
|     ;
 | |
|   for (; auto [value] = Get();) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     return value;
 | |
| }
 | |
| } // namespace CondInFor
 | |
| 
 | |
| struct IntegerLike {
 | |
|   bool flag;
 | |
|   float data;
 | |
|   operator int() const {
 | |
|     return int(data);
 | |
|   }
 | |
| };
 | |
| 
 | |
| namespace CondInSwitch {
 | |
| int h(IntegerLike x) {
 | |
|   switch (auto [ok, d] = x) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|     ;
 | |
|   switch (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{statement requires expression of integer type ('Na' invalid)}}
 | |
|     ;
 | |
|   switch (auto [value] = Get()) {// expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
 | |
|   // expected-warning@-1{{switch condition has boolean value}}
 | |
|   case 1:
 | |
|     return value;
 | |
|   }
 | |
| }
 | |
| } // namespace CondInSwitch
 |