diff options
Diffstat (limited to 'test/Misc/diag-template-diffing.cpp')
-rw-r--r-- | test/Misc/diag-template-diffing.cpp | 79 |
1 files changed, 72 insertions, 7 deletions
diff --git a/test/Misc/diag-template-diffing.cpp b/test/Misc/diag-template-diffing.cpp index add96ef..4680707 100644 --- a/test/Misc/diag-template-diffing.cpp +++ b/test/Misc/diag-template-diffing.cpp @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-NOTREE -// RUN: %clang_cc1 -fsyntax-only %s -fno-elide-type -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-NOTREE -// RUN: %clang_cc1 -fsyntax-only %s -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-TREE -// RUN: %clang_cc1 -fsyntax-only %s -fno-elide-type -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-TREE +// RUN: not %clang_cc1 -fsyntax-only %s -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-NOTREE +// RUN: not %clang_cc1 -fsyntax-only %s -fno-elide-type -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-NOTREE +// RUN: not %clang_cc1 -fsyntax-only %s -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-TREE +// RUN: not %clang_cc1 -fsyntax-only %s -fno-elide-type -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-TREE // PR9548 - "no known conversion from 'vector<string>' to 'vector<string>'" // vector<string> refers to two different types here. Make sure the message @@ -935,10 +935,10 @@ namespace DependentDefault { B<int, char> b3; b1 = b2; // CHECK-ELIDE-NOTREE: no viable overloaded '=' - // CHECK-ELIDE-NOTREE: no known conversion from 'B<char, (default) Trait<T>::Ty>' to 'B<int, int>' + // CHECK-ELIDE-NOTREE: no known conversion from 'B<char, [...]>' to 'B<int, [...]>' b3 = b1; // CHECK-ELIDE-NOTREE: no viable overloaded '=' - // CHECK-ELIDE-NOTREE: no known conversion from 'B<[...], (default) Trait<T>::Ty>' to 'B<[...], char>' + // CHECK-ELIDE-NOTREE: no known conversion from 'B<[...], (default) int>' to 'B<[...], char>' b2 = b3; // CHECK-ELIDE-NOTREE: no viable overloaded '=' // CHECK-ELIDE-NOTREE: no known conversion from 'B<int, char>' to 'B<char, int>' @@ -1002,8 +1002,73 @@ namespace VariadicDefault { } } +namespace PointerArguments { + template <int *p> class T {}; + template <int* ...> class U {}; + int a, b, c; + int z[5]; + void test() { + T<&a> ta; + T<z> tz; + T<&b> tb(ta); + // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'T<&b>' + // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'T<&a>' to 'const T<&b>' for 1st argument + T<&c> tc(tz); + // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'T<&c>' + // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'T<z>' to 'const T<&c>' for 1st argument + + U<&a, &a> uaa; + U<&b> ub(uaa); + // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'U<&b>' + // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'U<&a, &a>' to 'const U<&b, (no argument)>' for 1st argument + + U<&b, &b, &b> ubbb(uaa); + // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'U<&b, &b, &b>' + // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'U<&a, &a, (no argument)>' to 'const U<&b, &b, &b>' for 1st argument + + } +} + +namespace DependentInt { + template<int Num> struct INT; + + template <class CLASS, class Int_wrapper = INT<CLASS::val> > + struct C; + + struct N { + static const int val = 1; + }; + + template <class M_T> + struct M {}; + + void test() { + using T1 = M<C<int, INT<0>>>; + using T2 = M<C<N>>; + T2 p; + T1 x = p; + // CHECK-ELIDE-NOTREE: no viable conversion from 'M<C<struct DependentInt::N, INT<1>>>' to 'M<C<int, INT<0>>>' + } +} + +namespace PR17510 { +class Atom; + +template <typename T> class allocator; +template <typename T, typename A> class vector; + +typedef vector<const Atom *, allocator<const Atom *> > AtomVector; + +template <typename T, typename A = allocator<const Atom *> > class vector {}; + +void foo() { + vector<Atom *> v; + AtomVector v2(v); + // CHECK-ELIDE-NOTREE: no known conversion from 'vector<class PR17510::Atom *, [...]>' to 'const vector<const class PR17510::Atom *, [...]>' +} +} + // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated. // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated. // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated. // CHECK-NOELIDE-TREE: {{[0-9]*}} errors generated. - |