]> granicus.if.org Git - clang/commitdiff
-Wempty-body: fix false negative triggered by macros
authorDmitri Gribenko <gribozavr@gmail.com>
Sun, 15 Mar 2015 01:08:23 +0000 (01:08 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Sun, 15 Mar 2015 01:08:23 +0000 (01:08 +0000)
When if statement condition ended in a macro:

    if (ptr == NULL);

the check used to consider the definition location of NULL, instead of the
current line.

Patch by Manasij Mukherjee.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232295 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/SemaCXX/warn-empty-body.cpp

index c4ff8b4ef39be7c9eaa565273e4842f99a585d1b..5eafa503486e39205c959df6f8498e0980a35e75 100644 (file)
@@ -8625,7 +8625,7 @@ bool ShouldDiagnoseEmptyStmtBody(const SourceManager &SourceMgr,
 
   // Get line numbers of statement and body.
   bool StmtLineInvalid;
-  unsigned StmtLine = SourceMgr.getSpellingLineNumber(StmtLoc,
+  unsigned StmtLine = SourceMgr.getPresumedLineNumber(StmtLoc,
                                                       &StmtLineInvalid);
   if (StmtLineInvalid)
     return false;
index d3aaac1d8c369640b9d627388085438d020b418d..a248c4251d5250c7047534ec1e8872b10978a259 100644 (file)
@@ -4,10 +4,17 @@ void a(int i);
 int b();
 int c();
 
+#define MACRO_A 0
+
 void test1(int x, int y) {
   while(true) {
     if (x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
 
+    // Check that we handle conditions that start or end with a macro
+    // correctly.
+    if (x == MACRO_A); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
+    if (MACRO_A == x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
+
     int i;
     // PR11329
     for (i = 0; i < x; i++); { // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}