60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
 | |
| 
 | |
| template<typename T>
 | |
| struct only {
 | |
|   only(T);
 | |
|   template<typename U> only(U) = delete; // expected-note {{here}}
 | |
| };
 | |
| 
 | |
| template<typename ...T>
 | |
| void f(T ...t) {
 | |
|   auto x(t...); // expected-error {{is empty}} expected-error {{contains multiple expressions}}
 | |
|   only<int> check = x;
 | |
| }
 | |
| 
 | |
| void g() {
 | |
|   f(); // expected-note {{here}}
 | |
|   f(0);
 | |
|   f(0, 1); // expected-note {{here}}
 | |
| }
 | |
| 
 | |
| 
 | |
| template<typename T>
 | |
| bool h(T t) {
 | |
|   auto a = t;
 | |
|   decltype(a) b;
 | |
|   a = a + b;
 | |
| 
 | |
|   auto p = new auto(t);
 | |
| 
 | |
|   only<double*> test = p; // expected-error {{conversion function from 'char *' to 'only<double *>'}}
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| bool b = h('x'); // expected-note {{here}}
 | |
| 
 | |
| // PR 9276 - Make sure we check auto types deduce the same
 | |
| // in the case of a dependent initializer
 | |
| namespace PR9276 {
 | |
|   template<typename T>
 | |
|   void f() {
 | |
|     auto i = T(), j = 0; // expected-error {{deduced as 'long' in declaration of 'i' and deduced as 'int' in declaration of 'j'}}
 | |
|   }
 | |
| 
 | |
|   void g() {
 | |
|     f<long>(); // expected-note {{here}}
 | |
|     f<int>();
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace NoRepeatedDiagnostic {
 | |
|   template<typename T>
 | |
|   void f() {
 | |
|     auto a = 0, b = 0.0, c = T(); // expected-error {{deduced as 'int' in declaration of 'a' and deduced as 'double' in declaration of 'b'}}
 | |
|   }
 | |
|   // We've already diagnosed an issue. No extra diagnostics is needed for these.
 | |
|   template void f<int>();
 | |
|   template void f<double>();
 | |
|   template void f<char>();
 | |
| }
 |