diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-04-28 12:30:05 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-04-28 12:30:05 +0000 |
commit | baa9030de29c31b34559f64817b77f4df0e40d8b (patch) | |
tree | 90a9047dede4b909ba9f979bae0b02c45a2a52ec /clang/lib/Sema/SemaDecl.cpp | |
parent | 8070bf0a548d80e3d6a21a15c6149e69d70ae317 (diff) | |
download | bcm5719-llvm-baa9030de29c31b34559f64817b77f4df0e40d8b.tar.gz bcm5719-llvm-baa9030de29c31b34559f64817b77f4df0e40d8b.zip |
[Sema] Avoid an invalid redefinition error that was presented for
of a function whose previous definition was typo-corrected
rdar://28550928
Differential Revision: https://reviews.llvm.org/D25113
llvm-svn: 301643
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index cffeb0bc7f5..054ccb64cbe 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7424,6 +7424,10 @@ class DifferentNameValidatorCCC : public CorrectionCandidateCallback { } // end anonymous namespace +void Sema::MarkTypoCorrectedFunctionDefinition(const NamedDecl *F) { + TypoCorrectedFunctionDefinitions.insert(F); +} + /// \brief Generate diagnostics for an invalid function redeclaration. /// /// This routine handles generating the diagnostic messages for an invalid @@ -7521,6 +7525,8 @@ static NamedDecl *DiagnoseInvalidRedeclaration( if ((*I)->getCanonicalDecl() == Canonical) Correction.setCorrectionDecl(*I); + // Let Sema know about the correction. + SemaRef.MarkTypoCorrectedFunctionDefinition(Result); SemaRef.diagnoseTypo( Correction, SemaRef.PDiag(IsLocalFriend @@ -11732,6 +11738,11 @@ Sema::CheckForFunctionRedefinition(FunctionDecl *FD, if (canRedefineFunction(Definition, getLangOpts())) return; + // Don't emit an error when this is redifinition of a typo-corrected + // definition. + if (TypoCorrectedFunctionDefinitions.count(Definition)) + return; + // If we don't have a visible definition of the function, and it's inline or // a template, skip the new definition. if (SkipBody && !hasVisibleDefinition(Definition) && |