Fix for rhbz#1674031
This commit is contained in:
parent
fe4c5544fa
commit
09654593bd
137
0001-Fix-isInSystemMacro-to-handle-pasted-macros.patch
Normal file
137
0001-Fix-isInSystemMacro-to-handle-pasted-macros.patch
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
From cb7fd3caeee52fe94461b717294c4db4056853e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Serge Guelton <sguelton@redhat.com>
|
||||||
|
Date: Fri, 1 Feb 2019 06:11:44 +0000
|
||||||
|
Subject: [PATCH 1/3] 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 dcc4a37e23..c6b92f9000 100644
|
||||||
|
--- a/include/clang/Basic/SourceManager.h
|
||||||
|
+++ b/include/clang/Basic/SourceManager.h
|
||||||
|
@@ -1441,6 +1441,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));
|
||||||
|
@@ -1453,7 +1459,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
|
||||||
|
|
39
0002-Format-isInSystemMacro-after-D55782.patch
Normal file
39
0002-Format-isInSystemMacro-after-D55782.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From 49b29ff9feafd8b9041e2a76cbe843115d263ced Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fangrui Song <maskray@google.com>
|
||||||
|
Date: Mon, 11 Feb 2019 13:30:04 +0000
|
||||||
|
Subject: [PATCH 2/3] Format isInSystemMacro after D55782
|
||||||
|
|
||||||
|
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@353697 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||||
|
---
|
||||||
|
include/clang/Basic/SourceManager.h | 10 ++++------
|
||||||
|
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
|
||||||
|
index c6b92f9000..f44239d9ce 100644
|
||||||
|
--- a/include/clang/Basic/SourceManager.h
|
||||||
|
+++ b/include/clang/Basic/SourceManager.h
|
||||||
|
@@ -1459,17 +1459,15 @@ public:
|
||||||
|
|
||||||
|
/// Returns whether \p Loc is expanded from a macro in a system header.
|
||||||
|
bool isInSystemMacro(SourceLocation loc) const {
|
||||||
|
- if(!loc.isMacroID())
|
||||||
|
+ 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))) {
|
||||||
|
+ if (isWrittenInScratchSpace(getSpellingLoc(loc)))
|
||||||
|
return isInSystemHeader(getSpellingLoc(getImmediateMacroCallerLoc(loc)));
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- return isInSystemHeader(getSpellingLoc(loc));
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
+ return isInSystemHeader(getSpellingLoc(loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The size of the SLocEntry that \p FID represents.
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
@ -0,0 +1,63 @@
|
|||||||
|
From a6b7f0946df82ca207b27f1931d4b430ab77e5e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Serge Guelton <sguelton@redhat.com>
|
||||||
|
Date: Thu, 16 May 2019 12:40:00 +0000
|
||||||
|
Subject: [PATCH 3/3] Fix isInSystemMacro in presence of macro and pasted token
|
||||||
|
|
||||||
|
When a warning is raised from the expansion of a system macro that
|
||||||
|
involves pasted token, there was still situations were they were not
|
||||||
|
skipped, as showcased by this issue:
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1472437
|
||||||
|
|
||||||
|
Differential Revision: https://reviews.llvm.org/D59413
|
||||||
|
|
||||||
|
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360885 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||||
|
---
|
||||||
|
include/clang/Basic/SourceManager.h | 9 +++++++--
|
||||||
|
test/Misc/no-warn-in-system-macro.c | 7 ++++++-
|
||||||
|
2 files changed, 13 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
|
||||||
|
index f44239d9ce..c964c64faf 100644
|
||||||
|
--- a/include/clang/Basic/SourceManager.h
|
||||||
|
+++ b/include/clang/Basic/SourceManager.h
|
||||||
|
@@ -1464,8 +1464,13 @@ public:
|
||||||
|
|
||||||
|
// 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)));
|
||||||
|
+ // There can be several level of token pasting.
|
||||||
|
+ if (isWrittenInScratchSpace(getSpellingLoc(loc))) {
|
||||||
|
+ do {
|
||||||
|
+ loc = getImmediateMacroCallerLoc(loc);
|
||||||
|
+ } while (isWrittenInScratchSpace(getSpellingLoc(loc)));
|
||||||
|
+ return isInSystemMacro(loc);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return isInSystemHeader(getSpellingLoc(loc));
|
||||||
|
}
|
||||||
|
diff --git a/test/Misc/no-warn-in-system-macro.c b/test/Misc/no-warn-in-system-macro.c
|
||||||
|
index a319b14c9c..a351b89256 100644
|
||||||
|
--- a/test/Misc/no-warn-in-system-macro.c
|
||||||
|
+++ b/test/Misc/no-warn-in-system-macro.c
|
||||||
|
@@ -3,11 +3,16 @@
|
||||||
|
|
||||||
|
#include <no-warn-in-system-macro.c.inc>
|
||||||
|
|
||||||
|
+#define MACRO(x) x
|
||||||
|
+
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
double foo = 1.0;
|
||||||
|
|
||||||
|
if (isnan(foo))
|
||||||
|
return 1;
|
||||||
|
- return 0;
|
||||||
|
+
|
||||||
|
+ MACRO(isnan(foo));
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
11
clang.spec
11
clang.spec
@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
Name: %pkg_name
|
Name: %pkg_name
|
||||||
Version: %{maj_ver}.%{min_ver}.%{patch_ver}
|
Version: %{maj_ver}.%{min_ver}.%{patch_ver}
|
||||||
Release: 2%{?rc_ver:.rc%{rc_ver}}%{?dist}
|
Release: 3%{?rc_ver:.rc%{rc_ver}}%{?dist}
|
||||||
Summary: A C language family front-end for LLVM
|
Summary: A C language family front-end for LLVM
|
||||||
|
|
||||||
License: NCSA
|
License: NCSA
|
||||||
@ -74,6 +74,9 @@ Source1: http://%{?rc_ver:pre}releases.llvm.org/%{version}/%{?rc_ver:rc%{rc_ver}
|
|||||||
Patch4: 0002-gtest-reorg.patch
|
Patch4: 0002-gtest-reorg.patch
|
||||||
Patch9: 0001-Fix-uninitialized-value-in-ABIArgInfo.patch
|
Patch9: 0001-Fix-uninitialized-value-in-ABIArgInfo.patch
|
||||||
Patch11: 0001-ToolChain-Add-lgcc_s-to-the-linker-flags-when-using-.patch
|
Patch11: 0001-ToolChain-Add-lgcc_s-to-the-linker-flags-when-using-.patch
|
||||||
|
Patch12: 0001-Fix-isInSystemMacro-to-handle-pasted-macros.patch
|
||||||
|
Patch13: 0002-Format-isInSystemMacro-after-D55782.patch
|
||||||
|
Patch14: 0003-Fix-isInSystemMacro-in-presence-of-macro-and-pasted-.patch
|
||||||
|
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++
|
||||||
@ -216,6 +219,9 @@ pathfix.py -i %{__python3} -pn \
|
|||||||
%patch4 -p1 -b .gtest
|
%patch4 -p1 -b .gtest
|
||||||
%patch9 -p1 -b .abi-arginfo
|
%patch9 -p1 -b .abi-arginfo
|
||||||
%patch11 -p1 -b .libcxx-fix
|
%patch11 -p1 -b .libcxx-fix
|
||||||
|
%patch12 -p1 -b .double-promotion-0
|
||||||
|
%patch13 -p1 -b .double-promotion-1
|
||||||
|
%patch14 -p1 -b .double-promotion-2
|
||||||
|
|
||||||
mv ../%{clang_tools_srcdir} tools/extra
|
mv ../%{clang_tools_srcdir} tools/extra
|
||||||
|
|
||||||
@ -418,6 +424,9 @@ false
|
|||||||
|
|
||||||
%endif
|
%endif
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu May 16 2019 sguelton@redhat.com - 8.0.0-3
|
||||||
|
- Fix for rhbz#1674031
|
||||||
|
|
||||||
* Fri Apr 12 2019 sguelton@redhat.com - 8.0.0-2
|
* Fri Apr 12 2019 sguelton@redhat.com - 8.0.0-2
|
||||||
- Remove useless patch thanks to GCC upgrade
|
- Remove useless patch thanks to GCC upgrade
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user