| // 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 {{requires an initializer}} 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>(); |
| } |