diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 6 | ||||
| -rw-r--r-- | clang/test/PCH/pr18806.cpp | 31 |
2 files changed, 34 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 7781a7d1b05..a0ee3d37c5c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5203,9 +5203,9 @@ QualType ASTReader::readTypeRecord(unsigned Index) { unsigned Idx = 0; QualType Parm = readType(*Loc.F, Record, Idx); QualType Replacement = readType(*Loc.F, Record, Idx); - return - Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm), - Replacement); + return Context.getSubstTemplateTypeParmType( + cast<TemplateTypeParmType>(Parm), + Context.getCanonicalType(Replacement)); } case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { diff --git a/clang/test/PCH/pr18806.cpp b/clang/test/PCH/pr18806.cpp new file mode 100644 index 00000000000..c28320db956 --- /dev/null +++ b/clang/test/PCH/pr18806.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -std=c++11 -include-pch %t -verify %s + +// expected-no-diagnostics + +// Before the patch, this test triggered an assert violation in +// ASTContext::getSubstTemplateTypeParmType. + +#ifndef HEADER_INCLUDED +#define HEADER_INCLUDED + +template <typename T> +using Id = T; + +template <typename X> +struct Class1 { + template <typename Y, typename = decltype(Y())> + struct Nested1; +}; + +template <typename A> +struct Class2 { + template <typename B, typename = Id<decltype(B())>> + struct Nested2; +}; + +#else + +Class2<char> test; + +#endif |

