[cfe-commits] r146153 - in /cfe/trunk: lib/Sema/SemaDecl.cpp test/Sema/c89.c test/Sema/implicit-decl.c

Hans Wennborg hans at hanshq.net
Thu Dec 8 07:56:07 PST 2011


Author: hans
Date: Thu Dec  8 09:56:07 2011
New Revision: 146153

URL: http://llvm.org/viewvc/llvm-project?rev=146153&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/Sema/c89.c
    cfe/trunk/test/Sema/implicit-decl.c

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=146153&r1=146152&r2=146153&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Dec  8 09:56:07 2011
@@ -7259,36 +7259,36 @@
     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;
+    diag_id = diag::warn_implicit_function_decl;
+  Diag(Loc, diag_id) << &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;
+  // 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();

Modified: cfe/trunk/test/Sema/c89.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/c89.c?rev=146153&r1=146152&r2=146153&view=diff
==============================================================================
--- cfe/trunk/test/Sema/c89.c (original)
+++ cfe/trunk/test/Sema/c89.c Thu Dec  8 09:56:07 2011
@@ -83,9 +83,9 @@
 
 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'}} */
 }

Modified: cfe/trunk/test/Sema/implicit-decl.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/implicit-decl.c?rev=146153&r1=146152&r2=146153&view=diff
==============================================================================
--- cfe/trunk/test/Sema/implicit-decl.c (original)
+++ cfe/trunk/test/Sema/implicit-decl.c Thu Dec  8 09:56:07 2011
@@ -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 @@
    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'}} \





More information about the cfe-commits mailing list