diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-08-24 15:23:48 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-08-24 15:23:48 +0000 |
commit | 5842ba9fd482bb2fe5198b32c2ae549cd5474e6d (patch) | |
tree | 5eb6082ee5fcb3648d63fb7ee4398da2607c949a /lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 19b7b158699983e70693c73f3b982fd16c056585 (diff) |
Try to complete a type before looking for conversion functions within
that type. Note that we do not produce a diagnostic if the type is
incomplete; rather, we just don't look for conversion functions. Fixes PR4660.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79919 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 0f66c45b26..1446d51ef7 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -624,12 +624,19 @@ bool Sema::InstantiateTemplatePattern(SourceLocation PointOfInstantiation, /// \param TemplateArgs The template arguments to be substituted into /// the pattern. /// +/// \param ExplicitInstantiation whether this is an explicit instantiation +/// (otherwise, it is an implicit instantiation). +/// +/// \param Complain whether to complain if the class cannot be instantiated due +/// to the lack of a definition. +/// /// \returns true if an error occurred, false otherwise. bool Sema::InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const TemplateArgumentList &TemplateArgs, - bool ExplicitInstantiation) { + bool ExplicitInstantiation, + bool Complain) { bool Invalid = false; // Lazily instantiate member templates here. @@ -639,7 +646,9 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *PatternDef = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context)); if (!PatternDef) { - if (Pattern == Instantiation->getInstantiatedFromMemberClass()) { + if (!Complain) { + // Say nothing + } else if (Pattern == Instantiation->getInstantiatedFromMemberClass()) { Diag(PointOfInstantiation, diag::err_implicit_instantiate_member_undefined) << Context.getTypeDeclType(Instantiation); @@ -713,7 +722,8 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, bool Sema::InstantiateClassTemplateSpecialization( ClassTemplateSpecializationDecl *ClassTemplateSpec, - bool ExplicitInstantiation) { + bool ExplicitInstantiation, + bool Complain) { // Perform the actual instantiation on the canonical declaration. ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>( ClassTemplateSpec->getCanonicalDecl()); @@ -791,7 +801,8 @@ Sema::InstantiateClassTemplateSpecialization( bool Result = InstantiateClass(ClassTemplateSpec->getLocation(), ClassTemplateSpec, Pattern, *TemplateArgs, - ExplicitInstantiation); + ExplicitInstantiation, + Complain); for (unsigned I = 0, N = Matched.size(); I != N; ++I) { // FIXME: Implement TemplateArgumentList::Destroy! |