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();
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'}} */
}
-// RUN: %clang_cc1 %s -verify -fsyntax-only
+// RUN: %clang_cc1 %s -verify -fsyntax-only -Werror
typedef int int32_t;
typedef unsigned char Boolean;
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'}} \