[PCH] Write out the ClassTemplateDecl::Common::InjectedClassNameType type

reference instead of relying on computing it.

In general, if storage is no issue, it is preferable to deserialize info from
the PCH instead of trying to recompute it after the PCH was loaded.

The incentive to change this now was due to r155303 changing how friend template
classes in dependent contexts are handled; such classes can now be chained to
a previous template class but the computed InjectedClassNameType may be different
due to the extra template parameters from the dependent context.

The new handling requires more investigation but, in the meantime, writing out
InjectedClassNameType fixes PCH issue in rdar://12627738.

llvm-svn: 167425
This commit is contained in:
Argyrios Kyrtzidis 2012-11-06 00:35:02 +00:00
parent 88bc7f35b8
commit a1c27eb8dd
3 changed files with 49 additions and 3 deletions

View File

@ -1353,10 +1353,10 @@ void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
for (unsigned I = 0; I != Size; ++I)
SpecIDs.push_back(ReadDeclID(Record, Idx));
ClassTemplateDecl::Common *CommonPtr = D->getCommonPtr();
if (SpecIDs[0]) {
typedef serialization::DeclID DeclID;
ClassTemplateDecl::Common *CommonPtr = D->getCommonPtr();
// FIXME: Append specializations!
CommonPtr->LazySpecializations
= new (Reader.getContext()) DeclID [SpecIDs.size()];
@ -1364,7 +1364,7 @@ void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
SpecIDs.size() * sizeof(DeclID));
}
// InjectedClassNameType is computed.
CommonPtr->InjectedClassNameType = Reader.readType(F, Record, Idx);
}
}

View File

@ -1084,7 +1084,7 @@ void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
Writer.AddDeclRef(&*I, Record);
}
// InjectedClassNameType is computed, no need to write it.
Writer.AddTypeRef(D->getCommonPtr()->InjectedClassNameType, Record);
}
Code = serialization::DECL_CLASS_TEMPLATE;
}

View File

@ -0,0 +1,46 @@
// Test this without pch.
// RUN: %clang_cc1 -include %s -fsyntax-only -verify %s
// Test with pch.
// RUN: %clang_cc1 -emit-pch -o %t %s
// RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s
// expected-no-diagnostics
#ifndef HEADER
#define HEADER
// rdar://12627738
namespace rdar12627738 {
class RecyclerTag {
template <typename T> friend class Recycler;
};
}
#else
namespace rdar12627738 {
template<typename TTag>
class CRN {
template <typename T> friend class Recycler;
};
template<typename T>
class Recycler {
public:
Recycler ();
};
template<typename T>
Recycler<T>::Recycler ()
{
}
}
#endif