From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) by sourceware.org (Postfix) with ESMTP id 7D4803858C5E for ; Tue, 30 Jan 2024 20:28:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7D4803858C5E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gentoo.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gentoo.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7D4803858C5E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=140.211.166.183 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706646488; cv=none; b=SpTWwXoxsAo3xBR4sdz13h6/CdP8uBhxy1WWgnl03LhUZPA5bwyMZ7kxu9kvltSUfG/SxRi5eXNjyYE+AON3UP30+sFhdwMlq8xOk2YHHxzb/0vVwDhnFHZapnl8fN/veHtmsDiQG8NyvgdrhWzkpV4cJn0/41DkTWtPJ60noKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706646488; c=relaxed/simple; bh=jIum7sHlnZWTjNK2NnRA5CHrTfYVvg+R3M26+dSTOJY=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=pO0E4aF6G9SiylGvC/U0PloFm45lgD0Sp+dF7DJw1ZSw1P0lPXmzRbLk0L2Dklho6UcKS51Mv5kDWejvrOV2w+ntHLv3cz8q6No0MgTDWpcZCIgQP3DP9PrLCzgH0nCVIFmCTMP+0PwR6rwaL3PpP4hJrwC8j/R+5H5ds8STpKY= ARC-Authentication-Results: i=1; server2.sourceware.org References: <0623E896-6B99-49EC-9144-B41BC51089F0@andric.com> <87sf5tzibq.fsf@gentoo.org> <878r4ktlbh.fsf@gentoo.org> <87il3a97vb.fsf@gentoo.org> User-agent: mu4e 1.10.8; emacs 30.0.50 From: Sam James To: Sam James Cc: Dimitry Andric , Gerald Pfeifer , gcc-patches@gcc.gnu.org, Jeff Law , Arsen =?utf-8?Q?Arsenovi=C4=87?= Subject: Re: [PING][PATCH] Include safe-ctype.h after C++ standard headers, to avoid over-poisoning Date: Tue, 30 Jan 2024 20:27:26 +0000 Organization: Gentoo In-reply-to: <87il3a97vb.fsf@gentoo.org> Message-ID: <87plxi7ei5.fsf@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-9.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,KAM_SHORT,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,TO_EQ_FM_DIRECT_MX,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Sam James writes: > [[PGP Signed Part:Undecided]] > > Sam James writes: > >> Sam James writes: >> >>> Dimitry Andric writes: >>> >>>> Ping. It would be nice to get this QoL fix in. >>>> >>> >>> Yes please - we've been using this in Gentoo since around when it was >>> first posted. No complaints. >>> >>> I cannot approve but it looks good to me. >> >> Ping. > > Ping. This is straightforward, I just can't merge it myself. > >> We discussed it on IRC and Iain is going to test it on Darwin, I'm going to test it on the cfarm on platforms the patch was not already exposed to, after Jeff raised some concerns. I also have an additional hunk or two I'm testing for JIT. >>> >>>> -Dimitry >>>> >>>>> On 28 Sep 2023, at 18:37, Dimitry Andric wrote: >>>>> >>>>> Ref: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111632 >>>>> >>>>> When building gcc's C++ sources against recent libc++, the poisoning of >>>>> the ctype macros due to including safe-ctype.h before including C++ >>>>> standard headers such as , , etc, causes many compilation >>>>> errors, similar to: >>>>> >>>>> In file included from /home/dim/src/gcc/master/gcc/gensupport.cc:23: >>>>> In file included from /home/dim/src/gcc/master/gcc/system.h:233: >>>>> 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 /home/dim/src/gcc/master/gcc/gensupport.cc:23: >>>>> In file included from /home/dim/src/gcc/master/gcc/system.h:233: >>>>> 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 >>>>> | ^ >>>>> /home/dim/src/gcc/master/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 libc++ uses different transitive includes than >>>>> libstdc++, and some of those transitive includes pull in various ctype >>>>> declarations (typically via ). >>>>> >>>>> There was already a special case for including before >>>>> safe-ctype.h, so move the rest of the C++ standard header includes to >>>>> the same location, to fix the problem. >>>>> >>>>> Signed-off-by: Dimitry Andric >>>>> --- >>>>> gcc/system.h | 39 ++++++++++++++++++--------------------- >>>>> 1 file changed, 18 insertions(+), 21 deletions(-) >>>>> >>>>> diff --git a/gcc/system.h b/gcc/system.h >>>>> index e924152ad4c..7a516b11438 100644 >>>>> --- a/gcc/system.h >>>>> +++ b/gcc/system.h >>>>> @@ -194,27 +194,8 @@ extern int fprintf_unlocked (FILE *, const char *, ...); >>>>> #undef fread_unlocked >>>>> #undef fwrite_unlocked >>>>> >>>>> -/* Include before "safe-ctype.h" to avoid GCC poisoning >>>>> - the ctype macros through safe-ctype.h */ >>>>> - >>>>> -#ifdef __cplusplus >>>>> -#ifdef INCLUDE_STRING >>>>> -# include >>>>> -#endif >>>>> -#endif >>>>> - >>>>> -/* There are an extraordinary number of issues with . >>>>> - The last straw is that it varies with the locale. Use libiberty's >>>>> - replacement instead. */ >>>>> -#include "safe-ctype.h" >>>>> - >>>>> -#include >>>>> - >>>>> -#include >>>>> - >>>>> -#if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO >>>>> -extern int errno; >>>>> -#endif >>>>> +/* Include C++ standard headers before "safe-ctype.h" to avoid GCC >>>>> + poisoning the ctype macros through safe-ctype.h */ >>>>> >>>>> #ifdef __cplusplus >>>>> #if defined (INCLUDE_ALGORITHM) || !defined (HAVE_SWAP_IN_UTILITY) >>>>> @@ -229,6 +210,9 @@ extern int errno; >>>>> #ifdef INCLUDE_SET >>>>> # include >>>>> #endif >>>>> +#ifdef INCLUDE_STRING >>>>> +# include >>>>> +#endif >>>>> #ifdef INCLUDE_VECTOR >>>>> # include >>>>> #endif >>>>> @@ -245,6 +229,19 @@ extern int errno; >>>>> # include >>>>> #endif >>>>> >>>>> +/* There are an extraordinary number of issues with . >>>>> + The last straw is that it varies with the locale. Use libiberty's >>>>> + replacement instead. */ >>>>> +#include "safe-ctype.h" >>>>> + >>>>> +#include >>>>> + >>>>> +#include >>>>> + >>>>> +#if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO >>>>> +extern int errno; >>>>> +#endif >>>>> + >>>>> /* Some of glibc's string inlines cause warnings. Plus we'd rather >>>>> rely on (and therefore test) GCC's string builtins. */ >>>>> #define __NO_STRING_INLINES >>>>> -- >>>>> 2.42.0 >>>>> > > [[End of PGP Signed Part]]