From: Douglas Gregor Date: Mon, 28 Sep 2009 06:34:35 +0000 (+0000) Subject: Properly match instantiations of member function templates to the function templates... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0d696533420fca4cf32694621e3edf582ad4d06e;p=clang Properly match instantiations of member function templates to the function templates from which they were instantiated git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82969 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index b7548415aa..53252ec3f7 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1222,6 +1222,19 @@ static bool isInstantiationOf(ClassTemplateDecl *Pattern, return false; } +static bool isInstantiationOf(FunctionTemplateDecl *Pattern, + FunctionTemplateDecl *Instance) { + Pattern = Pattern->getCanonicalDecl(); + + do { + Instance = Instance->getCanonicalDecl(); + if (Pattern == Instance) return true; + Instance = Instance->getInstantiatedFromMemberTemplate(); + } while (Instance); + + return false; +} + static bool isInstantiationOf(CXXRecordDecl *Pattern, CXXRecordDecl *Instance) { Pattern = Pattern->getCanonicalDecl(); @@ -1309,6 +1322,9 @@ static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { if (ClassTemplateDecl *Temp = dyn_cast(Other)) return isInstantiationOf(cast(D), Temp); + if (FunctionTemplateDecl *Temp = dyn_cast(Other)) + return isInstantiationOf(cast(D), Temp); + if (FieldDecl *Field = dyn_cast(Other)) { if (!Field->getDeclName()) { // This is an unnamed field.