Bug 274041 - lang/gcc10 lang/gcc11 lang/gcc11-devel lang/gcc12 lang/gcc12-devel lang/gcc13 lang/gcc13-devel lang/gcc14-devel: fix build with libc++ 17
Summary: lang/gcc10 lang/gcc11 lang/gcc11-devel lang/gcc12 lang/gcc12-devel lang/gcc13...
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: Any Any
: --- Affects Some People
Assignee: Lorenzo Salvadore
URL:
Keywords:
Depends on:
Blocks: 273753
  Show dependency treegraph
 
Reported: 2023-09-23 07:53 UTC by Dimitry Andric
Modified: 2023-10-06 17:55 UTC (History)
2 users (show)

See Also:
salvadore: maintainer-feedback+


Attachments
lang/gcc10: fix build with libc++ 17 (1.35 KB, patch)
2023-09-23 07:58 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc11: fix build with libc++ 17 (1.35 KB, patch)
2023-09-23 07:58 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc11-devel: fix build with libc++ 17 (1.37 KB, patch)
2023-09-23 07:59 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc12: fix build with libc++ 17 (1.35 KB, patch)
2023-09-23 07:59 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc12-devel: fix build with libc++ 17 (1.37 KB, patch)
2023-09-23 08:00 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc13: fix build with libc++ 17 (1.35 KB, patch)
2023-09-23 08:00 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc13-devel: fix build with libc++ 17 (1.37 KB, patch)
2023-09-23 08:01 UTC, Dimitry Andric
no flags Details | Diff
lang/gcc14-devel: fix build with libc++ 17 (1.37 KB, patch)
2023-09-23 08:01 UTC, Dimitry Andric
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 07:53:40 UTC
When building relatively recent gcc ports (with C++ in them) against libc++ 17, you get errors similar to:

In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/cp/module.cc:208:
In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/system.h:239:
In file included from /usr/include/c++/v1/vector:321:
In file included from /usr/include/c++/v1/__format/formatter_bool.h:20:
In file included from /usr/include/c++/v1/__format/formatter_integral.h:32:
In file included from /usr/include/c++/v1/locale:202:
/usr/include/c++/v1/__locale:546:5: error: '__abi_tag__' attribute only applies to structs, variables, functions, and namespaces
  546 |     _LIBCPP_INLINE_VISIBILITY
      |     ^
/usr/include/c++/v1/__config:813:37: note: expanded from macro '_LIBCPP_INLINE_VISIBILITY'
  813 | #  define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI
      |                                     ^
/usr/include/c++/v1/__config:792:26: note: expanded from macro '_LIBCPP_HIDE_FROM_ABI'
  792 |           __attribute__((__abi_tag__(_LIBCPP_TOSTRING(_LIBCPP_VERSIONED_IDENTIFIER))))
      |                          ^
In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/cp/module.cc:208:
In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/system.h:239:
In file included from /usr/include/c++/v1/vector:321:
In file included from /usr/include/c++/v1/__format/formatter_bool.h:20:
In file included from /usr/include/c++/v1/__format/formatter_integral.h:32:
In file included from /usr/include/c++/v1/locale:202:
/usr/include/c++/v1/__locale:547:37: error: expected ';' at end of declaration list
  547 |     char_type toupper(char_type __c) const
      |                                     ^
/usr/include/c++/v1/__locale:553:48: error: too many arguments provided to function-like macro invocation
  553 |     const char_type* toupper(char_type* __low, const char_type* __high) const
      |                                                ^
/wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/../include/safe-ctype.h:146:9: note: macro 'toupper' defined here
  146 | #define toupper(c) do_not_use_toupper_with_safe_ctype
      |         ^

This is because gcc/system.h includes safe-ctype.h which redefines ctype macros such as toupper, tolower, etc to "poison" them.

However, it should only include the safe-ctype.h header *after* any C++ headers, such as <list>, <map>, <string>, etc, otherwise these might transitively include internal ctype headers (such as with libc++ 17), causing the above conflicts.

Here is a patch that moves the safe-ctype.h inclusion to later in gcc/system.h, which solves this issue, and makes it possible to build against libc++ 17.
Comment 1 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 07:58:28 UTC
Created attachment 245147 [details]
lang/gcc10: fix build with libc++ 17
Comment 2 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 07:58:58 UTC
Created attachment 245148 [details]
lang/gcc11: fix build with libc++ 17
Comment 3 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 07:59:22 UTC
Created attachment 245149 [details]
lang/gcc11-devel: fix build with libc++ 17
Comment 4 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 07:59:51 UTC
Created attachment 245150 [details]
lang/gcc12: fix build with libc++ 17
Comment 5 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 08:00:18 UTC
Created attachment 245151 [details]
lang/gcc12-devel: fix build with libc++ 17
Comment 6 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 08:00:42 UTC
Created attachment 245152 [details]
lang/gcc13: fix build with libc++ 17
Comment 7 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 08:01:09 UTC
Created attachment 245153 [details]
lang/gcc13-devel: fix build with libc++ 17
Comment 8 Dimitry Andric freebsd_committer freebsd_triage 2023-09-23 08:01:30 UTC
Created attachment 245154 [details]
lang/gcc14-devel: fix build with libc++ 17
Comment 9 Lorenzo Salvadore freebsd_committer freebsd_triage 2023-09-25 09:49:18 UTC
Assuming that you have tested those patches, I approve them, but please wait for an additional review from Gerald, past maintainer of the GCC ports. In particular, Gerald, do you think these patches can be easily upstreamed? Would another solution be preferable?
Comment 10 Dimitry Andric freebsd_committer freebsd_triage 2023-09-25 10:24:15 UTC
(In reply to Lorenzo Salvadore from comment #9)
Yes, I've built all gcc ports with a local poudriere here, using the world built from https://github.com/DimitryAndric/freebsd-src/tree/llvm-17-update (as described in bug 273753.

As far as the actual code concerns, in https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/system.h;hb=HEAD#l197 you can see the comment:

 197 /* Include <string> before "safe-ctype.h" to avoid GCC poisoning
 198    the ctype macros through safe-ctype.h */
 199 
 200 #ifdef __cplusplus
 201 #ifdef INCLUDE_STRING
 202 # include <string>
 203 #endif
 204 #endif

This was added in https://gcc.gnu.org/git/?p=gcc.git;a=commit;f=gcc/system.h;h=33c430b50424ec31c83603616fc94671fc7ffac2 for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63699 ("Bootstrap fails in libcc1 on darwin14") and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63750 ("use of undeclared identifier 'do_not_use_isalnum_with_safe_ctype'"), which are similar bugs:

* the "safe_ctype.h" header defines toupper, tolower etc so that any invocation of them results in a compile error.
* at the time, including <string> *after* "safe_ctype.h" on macOS caused some parts of <ctype.h> to be transitively included, so then you got compile errors.
* this also applies to FreeBSD since it uses libc++ instead of libstdc++.

My proposal is that this is very fragile, since you cannot know in advance which C++ standard headers transitively include other system headers, in particular <ctype.h>, so any C++ standard header (<list>, <map>, etc) should be included before "safe-ctype.h".

E.g. the only thing this patch does is move the block that includes "safe-ctype.h" to below all C++ standard header includes. This should work for all C++ environments, as far as I can tell.

Btw, if it makes it easier, I can also submit an upstream bug report for this. They will probably have an opinion. :)
Comment 11 Gerald Pfeifer freebsd_committer freebsd_triage 2023-09-26 05:11:38 UTC
(In reply to Lorenzo Salvadore from comment #9)
> Assuming that you have tested those patches, I approve them, but
> please wait for an additional review from Gerald [...]
> In particular, Gerald, do you think these patches can be easily 
> upstreamed?

Makes sense to me. My recommendation is to first push this to the
-devel ports and after a good week, maybe two, the others.

Re upstreaming: Definitely worth a try! I hope it does not get
ignored like your "packaging" issue, Lorenzo, though for this I
am more optimistic.

(In reply to Dimitry Andric from comment #10)
> Btw, if it makes it easier, I can also submit an upstream bug report
> for this. They will probably have an opinion. :)

That would be awesom, Dim.

I suggest to file a bug report and in addition send a patch against HEAD
to gcc-patches@gcc.gnu.org (copying me at gerald@pfeifer.com). I'll then
see what I can do should this get stuck.
Comment 12 Dimitry Andric freebsd_committer freebsd_triage 2023-09-28 16:41:04 UTC
(In reply to Gerald Pfeifer from comment #11)
I submitted https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111632, and mailed the patch to gcc-patches: https://gcc.gnu.org/pipermail/gcc-patches/2023-September/631611.html
Comment 13 commit-hook freebsd_committer freebsd_triage 2023-10-06 17:52:02 UTC
A commit in branch main references this bug:

URL: https://cgit.FreeBSD.org/ports/commit/?id=b7833e78f7bdf5b00b5b0d25ed983f1b8d413e32

commit b7833e78f7bdf5b00b5b0d25ed983f1b8d413e32
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2023-09-21 17:49:57 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2023-10-06 17:48:53 +0000

    lang/gcc10 lang/gcc11 lang/gcc11-devel lang/gcc12 lang/gcc12-devel lang/gcc13 lang/gcc13-devel lang/gcc14-devel: fix build with libc++ 17

    When building relatively recent gcc ports (with C++ in them) against
    libc++ 17, you get errors similar to:

      In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/cp/module.cc:208:
      In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/system.h:239:
      In file included from /usr/include/c++/v1/vector:321:
      In file included from /usr/include/c++/v1/__format/formatter_bool.h:20:
      In file included from /usr/include/c++/v1/__format/formatter_integral.h:32:
      In file included from /usr/include/c++/v1/locale:202:
      /usr/include/c++/v1/__locale:546:5: error: '__abi_tag__' attribute only applies to structs, variables, functions, and namespaces
        546 |     _LIBCPP_INLINE_VISIBILITY
            |     ^
      /usr/include/c++/v1/__config:813:37: note: expanded from macro '_LIBCPP_INLINE_VISIBILITY'
        813 | #  define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI
            |                                     ^
      /usr/include/c++/v1/__config:792:26: note: expanded from macro '_LIBCPP_HIDE_FROM_ABI'
        792 |           __attribute__((__abi_tag__(_LIBCPP_TOSTRING(_LIBCPP_VERSIONED_IDENTIFIER))))
            |                          ^
      In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/cp/module.cc:208:
      In file included from /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/system.h:239:
      In file included from /usr/include/c++/v1/vector:321:
      In file included from /usr/include/c++/v1/__format/formatter_bool.h:20:
      In file included from /usr/include/c++/v1/__format/formatter_integral.h:32:
      In file included from /usr/include/c++/v1/locale:202:
      /usr/include/c++/v1/__locale:547:37: error: expected ';' at end of declaration list
        547 |     char_type toupper(char_type __c) const
            |                                     ^
      /usr/include/c++/v1/__locale:553:48: error: too many arguments provided to function-like macro invocation
        553 |     const char_type* toupper(char_type* __low, const char_type* __high) const
            |                                                ^
      /wrkdirs/usr/ports/lang/gcc12/work/gcc-12.2.0/gcc/../include/safe-ctype.h:146:9: note: macro 'toupper' defined here
        146 | #define toupper(c) do_not_use_toupper_with_safe_ctype
            |         ^

    This is because gcc/system.h includes safe-ctype.h which redefines ctype
    macros such as toupper, tolower, etc to "poison" them.

    However, it should only include the safe-ctype.h header *after* any C++
    headers, such as <list>, <map>, <string>, etc, otherwise these might
    transitively include internal ctype headers (such as with libc++ 17),
    causing the above conflicts.

    Fix it by moving the safe-ctype.h inclusion to later in gcc/system.h,
    which solves this issue, and makes it possible to build against libc++
    17.

    See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111632

    PR:             274041
    Approved by:    salvadore (maintainer)
    MFH:            2023Q4

 lang/gcc10/files/patch-gcc_system.h (new)       | 42 +++++++++++++++++++++++++
 lang/gcc11-devel/files/patch-gcc_system.h (new) | 42 +++++++++++++++++++++++++
 lang/gcc11/files/patch-gcc_system.h (new)       | 42 +++++++++++++++++++++++++
 lang/gcc12-devel/files/patch-gcc_system.h (new) | 42 +++++++++++++++++++++++++
 lang/gcc12/files/patch-gcc_system.h (new)       | 42 +++++++++++++++++++++++++
 lang/gcc13-devel/files/patch-gcc_system.h (new) | 42 +++++++++++++++++++++++++
 lang/gcc13/files/patch-gcc_system.h (new)       | 42 +++++++++++++++++++++++++
 lang/gcc14-devel/files/patch-gcc_system.h (new) | 42 +++++++++++++++++++++++++
 8 files changed, 336 insertions(+)