summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-08-09 01:05:31 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-08-09 01:05:31 +0000
commit2bb3c34ed4a5794be6637e84de14aaf8199da972 (patch)
tree36f2bfe4894e34fc74095da39367d85a75a64154 /clang/lib/Serialization/ASTReader.cpp
parent31a57271bb43c405fb3d427b2796c271ba389df5 (diff)
downloadbcm5719-llvm-2bb3c34ed4a5794be6637e84de14aaf8199da972.tar.gz
bcm5719-llvm-2bb3c34ed4a5794be6637e84de14aaf8199da972.zip
[modules] When loading a template specialization, re-canonicalize its template
arguments because the reloaded form might have become non-canonical across the serialization/deserialization step (this particularly happens when the canonical form of the type involves an expression). llvm-svn: 244409
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 2412d04666f..ff771fd00a3 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -7568,9 +7568,19 @@ ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
llvm_unreachable("Unhandled template name kind!");
}
-TemplateArgument
-ASTReader::ReadTemplateArgument(ModuleFile &F,
- const RecordData &Record, unsigned &Idx) {
+TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
+ const RecordData &Record,
+ unsigned &Idx,
+ bool Canonicalize) {
+ if (Canonicalize) {
+ // The caller wants a canonical template argument. Sometimes the AST only
+ // wants template arguments in canonical form (particularly as the template
+ // argument lists of template specializations) so ensure we preserve that
+ // canonical form across serialization.
+ TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
+ return Context.getCanonicalTemplateArgument(Arg);
+ }
+
TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
switch (Kind) {
case TemplateArgument::Null:
@@ -7634,11 +7644,11 @@ void
ASTReader::
ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
ModuleFile &F, const RecordData &Record,
- unsigned &Idx) {
+ unsigned &Idx, bool Canonicalize) {
unsigned NumTemplateArgs = Record[Idx++];
TemplArgs.reserve(NumTemplateArgs);
while (NumTemplateArgs--)
- TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
+ TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
}
/// \brief Read a UnresolvedSet structure.
OpenPOWER on IntegriCloud