diff options
| -rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 2 | ||||
| -rw-r--r-- | clang/test/PCH/friend-template.cpp | 46 |
3 files changed, 49 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 17509c85278..c42944df634 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -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); } } diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index e84afba5495..74865657637 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -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; } diff --git a/clang/test/PCH/friend-template.cpp b/clang/test/PCH/friend-template.cpp new file mode 100644 index 00000000000..989819b64fb --- /dev/null +++ b/clang/test/PCH/friend-template.cpp @@ -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 |

