diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 26 | 
1 files changed, 25 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 3dd02430919..8c6aa6a7d4a 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -102,7 +102,8 @@ TemplateNameKind Sema::isTemplateName(Scope *S,    QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr); -  LookupResult R(*this, TName, SourceLocation(), LookupOrdinaryName); +  LookupResult R(*this, TName, Name.getSourceRange().getBegin(),  +                 LookupOrdinaryName);    R.suppressDiagnostics();    LookupTemplateName(R, S, SS, ObjectType, EnteringContext);    if (R.empty()) @@ -202,6 +203,29 @@ void Sema::LookupTemplateName(LookupResult &Found,    assert(!Found.isAmbiguous() &&           "Cannot handle template name-lookup ambiguities"); +  if (Found.empty()) { +    // If we did not find any names, attempt to correct any typos. +    DeclarationName Name = Found.getLookupName(); +    if (CorrectTypo(Found, S, &SS, LookupCtx)) { +      FilterAcceptableTemplateNames(Context, Found); +      if (!Found.empty() && isa<TemplateDecl>(*Found.begin())) { +        if (LookupCtx) +          Diag(Found.getNameLoc(), diag::err_no_member_template_suggest) +            << Name << LookupCtx << Found.getLookupName() << SS.getRange() +            << CodeModificationHint::CreateReplacement(Found.getNameLoc(), +                                          Found.getLookupName().getAsString()); +        else +          Diag(Found.getNameLoc(), diag::err_no_template_suggest) +            << Name << Found.getLookupName() +            << CodeModificationHint::CreateReplacement(Found.getNameLoc(), +                                          Found.getLookupName().getAsString()); +      } else +        Found.clear(); +    } else { +      Found.clear(); +    } +  } +    FilterAcceptableTemplateNames(Context, Found);    if (Found.empty())      return;  | 

