From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id E22133858C30 for ; Tue, 30 Jan 2024 16:19:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E22133858C30 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E22133858C30 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706631559; cv=none; b=wnPK3TDts7FI1DGxf/L65+skffL5rEIZj+2srQqHNBLd8kbKGtIWau/yrsKEsB+FmO6i7tiYY5ZHto2ybXLb67BoRpuZ8C4WiPr49cKlNj6WHlEJYtAqUAfkUvtV8cVRA66ZLfpK6MLh/kRxn6uZuCgnq/hhOJw2BYMRJRWssGM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706631559; c=relaxed/simple; bh=iqnekCmdO+RtVsVKryiMhmWfCzPC2rcqcH/ecT0Xo1g=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=K9Rm73c04WqjtqT9C2MW06cpGKPsIOQBZOs5SIp2LVD5rbk8ytS4/AQsenGBODLTLaYI3ZG7KMIgGF8TG30w29f+6AHLwuoYVHzJ4Ch2nvvLfDLuYKa/1yCCHvG/7YE3DnnWM4ZcfJH93obnC2msBOi9oqtpC0iquH6WjjwiKEs= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1706631557; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=nbTB3z+piMjSbe1vp0XZC7WVCmOJsmQtCBImGMJN7N8=; b=PkyhEqou3PLcRLCiRJNI7k+WFXlVydpMM3OME0HZW5HqJ5sfMRRTieti/U5wPtFh7+po2S +uiaz9SXoNg87nZPYGtIYYecb665cmM6dqc5L5POKAMKYeOxb1o/4+MyidwmmHHXzuba8f o0ZiudhNjOIp/THHOO9wJWfUA+1QuCM= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-685--O-Xot3XN0Cb1rpyp2mSQQ-1; Tue, 30 Jan 2024 11:19:13 -0500 X-MC-Unique: -O-Xot3XN0Cb1rpyp2mSQQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 89B5838562C4; Tue, 30 Jan 2024 16:19:13 +0000 (UTC) Received: from localhost (unknown [10.42.28.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4FD62C2590D; Tue, 30 Jan 2024 16:19:13 +0000 (UTC) Date: Tue, 30 Jan 2024 16:19:12 +0000 From: Jonathan Wakely To: Dimitry Andric Cc: gcc-patches@gcc.gnu.org, Gerald Pfeifer Subject: Re: [PATCH] Include safe-ctype.h after C++ standard headers, to avoid over-poisoning Message-ID: References: <0623E896-6B99-49EC-9144-B41BC51089F0@andric.com> MIME-Version: 1.0 In-Reply-To: <0623E896-6B99-49EC-9144-B41BC51089F0@andric.com> X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,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: On 28/09/23 18:37 +0200, 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. I can't approve this either, but FWIW it looks good to me. >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