diff options
author | Hans Wennborg <hans@hanshq.net> | 2011-12-08 15:56:07 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2011-12-08 15:56:07 +0000 |
commit | e3ca33aba226c7b5d50703df008ef0ef5f9ea7da (patch) | |
tree | 68bc65ba40d90b5489af9097db3c6eac1e120b03 | |
parent | 90ec96f3026480fa41057b05d58f338aed585f62 (diff) |
Only do typo correction for implicit function decls when
they are treated as errors.
Doing typo correction when these are just warnings slows down the
compilation of source which deliberately uses implicit function
declarations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146153 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 52 | ||||
-rw-r--r-- | test/Sema/c89.c | 6 | ||||
-rw-r--r-- | test/Sema/implicit-decl.c | 6 |
3 files changed, 32 insertions, 32 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 793cbf31bf..09ada7e55d 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -7259,36 +7259,36 @@ NamedDecl *Sema::ImplicitlyDefineFunction(SourceLocation Loc, return Pos->second; } - // See if we can find a typo correction. - TypoCorrection Corrected; - FunctionDecl *Func = 0; - std::string CorrectedStr; - std::string CorrectedQuotedStr; - if (S && (Corrected = CorrectTypo(DeclarationNameInfo(&II, Loc), - LookupOrdinaryName, S, 0))) { - // Since this is an implicit function declaration, we are only - // interested in a potential typo for a function name. - if ((Func = dyn_cast_or_null<FunctionDecl>( - Corrected.getCorrectionDecl()))) { - CorrectedStr = Corrected.getAsString(getLangOptions()); - CorrectedQuotedStr = Corrected.getQuoted(getLangOptions()); - } - } - // Extension in C99. Legal in C90, but warn about it. + unsigned diag_id; if (II.getName().startswith("__builtin_")) - Diag(Loc, diag::err_builtin_unknown) << &II; + diag_id = diag::err_builtin_unknown; else if (getLangOptions().C99) - Diag(Loc, diag::ext_implicit_function_decl) << &II; + diag_id = diag::ext_implicit_function_decl; else - Diag(Loc, diag::warn_implicit_function_decl) << &II; - - if (Func) { - // If we found a typo correction, then suggest that. - Diag(Loc, diag::note_function_suggestion) << CorrectedQuotedStr - << FixItHint::CreateReplacement(Loc, CorrectedStr); - if (Func->getLocation().isValid() && !II.getName().startswith("__builtin_")) - Diag(Func->getLocation(), diag::note_previous_decl) << CorrectedQuotedStr; + diag_id = diag::warn_implicit_function_decl; + Diag(Loc, diag_id) << &II; + + // Because typo correction is expensive, only do it if the implicit + // function declaration is going to be treated as an error. + if (Diags.getDiagnosticLevel(diag_id, Loc) >= DiagnosticsEngine::Error) { + TypoCorrection Corrected; + if (S && (Corrected = CorrectTypo(DeclarationNameInfo(&II, Loc), + LookupOrdinaryName, S, 0))) { + NamedDecl *Decl = Corrected.getCorrectionDecl(); + if (FunctionDecl *Func = dyn_cast_or_null<FunctionDecl>(Decl)) { + std::string CorrectedStr = Corrected.getAsString(getLangOptions()); + std::string CorrectedQuotedStr = Corrected.getQuoted(getLangOptions()); + + Diag(Loc, diag::note_function_suggestion) << CorrectedQuotedStr + << FixItHint::CreateReplacement(Loc, CorrectedStr); + + if (Func->getLocation().isValid() + && !II.getName().startswith("__builtin_")) + Diag(Func->getLocation(), diag::note_previous_decl) + << CorrectedQuotedStr; + } + } } // Set a Declarator for the implicit definition: int foo(); diff --git a/test/Sema/c89.c b/test/Sema/c89.c index e4cdc11be1..e11cd4e6f1 100644 --- a/test/Sema/c89.c +++ b/test/Sema/c89.c @@ -83,9 +83,9 @@ int test14() { return (&*test14)(); } int test15[5] = { [2] = 1 }; /* expected-warning {{designated initializers are a C99 feature}} */ -extern int printf(__const char *__restrict __format, ...); /* expected-note{{'printf' declared here}} */ +extern int printf(__const char *__restrict __format, ...); +/* Warn, but don't suggest typo correction. */ void test16() { - printg("Hello, world!\n"); /* expected-warning {{implicit declaration of function 'printg'}} - expected-note {{did you mean 'printf'?}} */ + printg("Hello, world!\n"); /* expected-warning {{implicit declaration of function 'printg'}} */ } diff --git a/test/Sema/implicit-decl.c b/test/Sema/implicit-decl.c index 72e42e05bb..2e1a865254 100644 --- a/test/Sema/implicit-decl.c +++ b/test/Sema/implicit-decl.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only +// RUN: %clang_cc1 %s -verify -fsyntax-only -Werror typedef int int32_t; typedef unsigned char Boolean; @@ -10,10 +10,10 @@ void func() { const char compDesc[16 + 1]; int32_t compCount = 0; if (_CFCalendarDecomposeAbsoluteTimeV(compDesc, vector, compCount)) { // expected-note {{previous implicit declaration is here}} \ - expected-warning {{implicit declaration of function '_CFCalendarDecomposeAbsoluteTimeV' is invalid in C99}} + expected-error {{implicit declaration of function '_CFCalendarDecomposeAbsoluteTimeV' is invalid in C99}} } - printg("Hello, World!\n"); // expected-warning{{implicit declaration of function 'printg' is invalid in C99}} \ + printg("Hello, World!\n"); // expected-error{{implicit declaration of function 'printg' is invalid in C99}} \ // expected-note{{did you mean 'printf'?}} __builtin_is_les(1, 3); // expected-error{{use of unknown builtin '__builtin_is_les'}} \ |