#37 Fix for rhbz#1674031
Merged 4 years ago by sergesanspaille. Opened 4 years ago by sergesanspaille.
rpms/ sergesanspaille/clang fix/rhbz1674031  into  master

@@ -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

+ 

@@ -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

+ 

file modified
+10 -1
@@ -61,7 +61,7 @@ 

  

  Name:		%pkg_name

  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

  

  License:	NCSA
@@ -74,6 +74,9 @@ 

  Patch4:		0002-gtest-reorg.patch

  Patch9:		0001-Fix-uninitialized-value-in-ABIArgInfo.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-c++
@@ -216,6 +219,9 @@ 

  %patch4 -p1 -b .gtest

  %patch9 -p1 -b .abi-arginfo

  %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

  
@@ -418,6 +424,9 @@ 

  

  %endif

  %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

  - Remove useless patch thanks to GCC upgrade