diff options
| author | Richard Trieu <rtrieu@google.com> | 2016-08-05 03:16:36 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2016-08-05 03:16:36 +0000 |
| commit | e1a6a7d6d3676db194928d0025a40fe9ea3842de (patch) | |
| tree | a8110a835fded1ddd29cca2b831901ad6541d5b4 /clang/test/Misc/diag-template-diffing.cpp | |
| parent | 7561ed01cb762d336d60dc2b05faab6c948e11fd (diff) | |
| download | bcm5719-llvm-e1a6a7d6d3676db194928d0025a40fe9ea3842de.tar.gz bcm5719-llvm-e1a6a7d6d3676db194928d0025a40fe9ea3842de.zip | |
Fix crash in template type diffing.
When the type being diffed is a type alias, and the orginal type is not a
templated type, then there will be no unsugared TemplateSpecializationType.
When this happens, exit early from the constructor. Also add assertions to
the other iterator accessor to prevent the iterator from being used.
llvm-svn: 277797
Diffstat (limited to 'clang/test/Misc/diag-template-diffing.cpp')
| -rw-r--r-- | clang/test/Misc/diag-template-diffing.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/clang/test/Misc/diag-template-diffing.cpp b/clang/test/Misc/diag-template-diffing.cpp index 90bcf6b2d17..a4f29cc8c7f 100644 --- a/clang/test/Misc/diag-template-diffing.cpp +++ b/clang/test/Misc/diag-template-diffing.cpp @@ -1455,7 +1455,37 @@ void run() { } // CHECK-ELIDE-NOTREE: error: no matching function for call to 'D' // CHECK-ELIDE-NOTREE: note: candidate function [with x = TypeAlias::X::X1] not viable: no known conversion from 'VectorType<X::X2>' to 'const VectorType<(TypeAlias::X)0>' for 1st argument +} + +namespace TypeAlias2 { +template <typename T> +class A {}; + +template <typename T> +using A_reg = A<T>; +void take_reg(A_reg<int>); + +template <typename T> +using A_ptr = A<T> *; +void take_ptr(A_ptr<int>); + +template <typename T> +using A_ref = const A<T> &; +void take_ref(A_ref<int>); +void run(A_reg<float> reg, A_ptr<float> ptr, A_ref<float> ref) { + take_reg(reg); +// CHECK-ELIDE-NOTREE: error: no matching function for call to 'take_reg' +// CHECK-ELIDE-NOTREE: note: candidate function not viable: no known conversion from 'A_reg<float>' to 'A_reg<int>' for 1st argument + + take_ptr(ptr); +// CHECK-ELIDE-NOTREE: error: no matching function for call to 'take_ptr' +// CHECK-ELIDE-NOTREE: note: candidate function not viable: no known conversion from 'A_ptr<float>' to 'A_ptr<int>' for 1st argument + + take_ref(ref); +// CHECK-ELIDE-NOTREE: error: no matching function for call to 'take_ref' +// CHECK-ELIDE-NOTREE: note: candidate function not viable: no known conversion from 'const A<float>' to 'const A<int>' for 1st argument +} } // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated. |

