Add missing patch
This commit is contained in:
parent
36f33bdfe5
commit
77598dc4d7
|
@ -0,0 +1,137 @@
|
|||
From 375167e36f900483c5ab28d86cb57b703f90fee2 Mon Sep 17 00:00:00 2001
|
||||
From: Serge Guelton <sguelton@redhat.com>
|
||||
Date: Fri, 1 Feb 2019 06:11:44 +0000
|
||||
Subject: [PATCH] Fix isInSystemMacro to handle pasted macros
|
||||
|
||||
Token pasted by the preprocessor (through ##) have a Spelling pointing to scratch buffer.
|
||||
As a result they are not recognized at system macro, even though the pasting happened in
|
||||
a system macro. Fix that by looking into the parent macro if the original lookup finds a
|
||||
scratch buffer.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D55782
|
||||
|
||||
This effectively fixes https://bugs.llvm.org/show_bug.cgi?id=35268,
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352838 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
include/clang/Basic/SourceManager.h | 18 +++++++++++++++++-
|
||||
test/Misc/no-warn-in-system-macro.c | 13 +++++++++++++
|
||||
test/Misc/no-warn-in-system-macro.c.inc | 9 +++++++++
|
||||
test/Misc/warn-in-system-macro-def.c | 21 +++++++++++++++++++++
|
||||
test/Misc/warn-in-system-macro-def.c.inc | 4 ++++
|
||||
5 files changed, 64 insertions(+), 1 deletion(-)
|
||||
create mode 100644 test/Misc/no-warn-in-system-macro.c
|
||||
create mode 100644 test/Misc/no-warn-in-system-macro.c.inc
|
||||
create mode 100644 test/Misc/warn-in-system-macro-def.c
|
||||
create mode 100644 test/Misc/warn-in-system-macro-def.c.inc
|
||||
|
||||
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
|
||||
index ba829a8773..b45357e645 100644
|
||||
--- a/include/clang/Basic/SourceManager.h
|
||||
+++ b/include/clang/Basic/SourceManager.h
|
||||
@@ -1440,6 +1440,12 @@ public:
|
||||
return Filename.equals("<command line>");
|
||||
}
|
||||
|
||||
+ /// Returns whether \p Loc is located in a <scratch space> file.
|
||||
+ bool isWrittenInScratchSpace(SourceLocation Loc) const {
|
||||
+ StringRef Filename(getPresumedLoc(Loc).getFilename());
|
||||
+ return Filename.equals("<scratch space>");
|
||||
+ }
|
||||
+
|
||||
/// Returns if a SourceLocation is in a system header.
|
||||
bool isInSystemHeader(SourceLocation Loc) const {
|
||||
return isSystem(getFileCharacteristic(Loc));
|
||||
@@ -1452,7 +1458,17 @@ public:
|
||||
|
||||
/// Returns whether \p Loc is expanded from a macro in a system header.
|
||||
bool isInSystemMacro(SourceLocation loc) const {
|
||||
- return loc.isMacroID() && isInSystemHeader(getSpellingLoc(loc));
|
||||
+ if(!loc.isMacroID())
|
||||
+ return false;
|
||||
+
|
||||
+ // This happens when the macro is the result of a paste, in that case
|
||||
+ // its spelling is the scratch memory, so we take the parent context.
|
||||
+ if (isWrittenInScratchSpace(getSpellingLoc(loc))) {
|
||||
+ return isInSystemHeader(getSpellingLoc(getImmediateMacroCallerLoc(loc)));
|
||||
+ }
|
||||
+ else {
|
||||
+ return isInSystemHeader(getSpellingLoc(loc));
|
||||
+ }
|
||||
}
|
||||
|
||||
/// The size of the SLocEntry that \p FID represents.
|
||||
diff --git a/test/Misc/no-warn-in-system-macro.c b/test/Misc/no-warn-in-system-macro.c
|
||||
new file mode 100644
|
||||
index 0000000000..a319b14c9c
|
||||
--- /dev/null
|
||||
+++ b/test/Misc/no-warn-in-system-macro.c
|
||||
@@ -0,0 +1,13 @@
|
||||
+// RUN: %clang_cc1 -isystem %S -Wdouble-promotion -fsyntax-only %s 2>&1 | FileCheck -allow-empty %s
|
||||
+// CHECK-NOT: warning:
|
||||
+
|
||||
+#include <no-warn-in-system-macro.c.inc>
|
||||
+
|
||||
+int main(void)
|
||||
+{
|
||||
+ double foo = 1.0;
|
||||
+
|
||||
+ if (isnan(foo))
|
||||
+ return 1;
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/test/Misc/no-warn-in-system-macro.c.inc b/test/Misc/no-warn-in-system-macro.c.inc
|
||||
new file mode 100644
|
||||
index 0000000000..3cbe7dfc16
|
||||
--- /dev/null
|
||||
+++ b/test/Misc/no-warn-in-system-macro.c.inc
|
||||
@@ -0,0 +1,9 @@
|
||||
+extern int __isnanf(float f);
|
||||
+extern int __isnan(double f);
|
||||
+extern int __isnanl(long double f);
|
||||
+#define isnan(x) \
|
||||
+ (sizeof (x) == sizeof (float) \
|
||||
+ ? __isnanf (x) \
|
||||
+ : sizeof (x) == sizeof (double) \
|
||||
+ ? __isnan (x) : __isnanl (x))
|
||||
+
|
||||
diff --git a/test/Misc/warn-in-system-macro-def.c b/test/Misc/warn-in-system-macro-def.c
|
||||
new file mode 100644
|
||||
index 0000000000..b295130702
|
||||
--- /dev/null
|
||||
+++ b/test/Misc/warn-in-system-macro-def.c
|
||||
@@ -0,0 +1,21 @@
|
||||
+// RUN: %clang_cc1 -isystem %S -Wdouble-promotion -fsyntax-only %s 2>&1 | FileCheck -allow-empty %s
|
||||
+// CHECK: warning:
|
||||
+// CHECK: expanded from macro 'ISNAN'
|
||||
+// CHECK: expanded from macro 'isnan'
|
||||
+
|
||||
+#include <warn-in-system-macro-def.c.inc>
|
||||
+
|
||||
+#define isnan(x) \
|
||||
+ (sizeof (x) == sizeof (float) \
|
||||
+ ? __isnanf (x) \
|
||||
+ : sizeof (x) == sizeof (double) \
|
||||
+ ? __isnan (x) : __isnanl (x))
|
||||
+
|
||||
+int main(void)
|
||||
+{
|
||||
+ double foo = 1.0;
|
||||
+
|
||||
+ if (ISNAN(foo))
|
||||
+ return 1;
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/test/Misc/warn-in-system-macro-def.c.inc b/test/Misc/warn-in-system-macro-def.c.inc
|
||||
new file mode 100644
|
||||
index 0000000000..5c7e60275a
|
||||
--- /dev/null
|
||||
+++ b/test/Misc/warn-in-system-macro-def.c.inc
|
||||
@@ -0,0 +1,4 @@
|
||||
+extern int __isnanf(float f);
|
||||
+extern int __isnan(double f);
|
||||
+extern int __isnanl(long double f);
|
||||
+#define ISNAN isnan
|
||||
--
|
||||
2.20.1
|
||||
|
Loading…
Reference in New Issue