aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2011-12-08 15:56:07 +0000
committerHans Wennborg <hans@hanshq.net>2011-12-08 15:56:07 +0000
commite3ca33aba226c7b5d50703df008ef0ef5f9ea7da (patch)
tree68bc65ba40d90b5489af9097db3c6eac1e120b03
parent90ec96f3026480fa41057b05d58f338aed585f62 (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.cpp52
-rw-r--r--test/Sema/c89.c6
-rw-r--r--test/Sema/implicit-decl.c6
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'}} \