Hi,

TL;DR
So, it turns out that there’s an interaction between standards wording that 
makes an implementation conforming when it has extensions that, when used, make 
a program ill-formed (but with no diagnostic required) (see the PR for more 
detail).

One might argue that using such extensions is asking for portability issues 
(the case here), but it’s not prohibited.

The following patch applies a fixincludes to work around it for now, I’ve 
tested it DTRT for me and posted to the PR for other folks to confirm it works 
for them.

OK for trunk (after wider testing)?
branches?

Iain

fixincludes/
xxxx-xx-xx  Erik Schnetter  <schnet...@gmail.com>
          Jakub Jelinek  <ja...@redhat.com>
          Iain Sandoe  <i...@sandoe.co.uk>

        PR bootstrap/89864
        * inclhack.def (darwin_ucred__Atomic): New, work around _Atomic keyword 
use in
        headers included by C++. 
        * fixincl.x: Regenerated.
        
diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
index 8fd9f7e..d8ce89a 100644
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -1622,6 +1622,25 @@ fix = {
                "#define UINTMAX_C(v) (v ## ULL)";
 };
 
+/*  The SDK included with XCode 10.2 has the file <sys/ucred.h> that uses the
+    C11 _Atomic keyword (exposing it to C++ code).  The work-around here 
follows
+    the header in declaring the entity volatile when _Atomic is not available.
+*/
+fix = {
+    hackname  = darwin_ucred__Atomic;
+    mach      = "*-*-darwin*";
+    files     = sys/ucred.h;
+    select    = "_Atomic";
+    c_fix     = wrap;
+    c_fix_arg = "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n"
+               "# define _Atomic volatile\n"
+               "#endif\n";
+    c_fix_arg = "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n"
+               "# undef _Atomic\n"
+               "#endif\n";
+    test_text = "_Atomic";
+};
+
 /*
  *  Fix <c_asm.h> on Digital UNIX V4.0:
  *  It contains a prototype for a DEC C internal asm() function,

Reply via email to