From patchwork Thu Jan 12 10:41:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rainer Orth X-Patchwork-Id: 91116 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp1555307qgi; Thu, 12 Jan 2017 02:42:25 -0800 (PST) X-Received: by 10.98.204.216 with SMTP id j85mr7973508pfk.130.1484217745554; Thu, 12 Jan 2017 02:42:25 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id 79si8887157pfs.104.2017.01.12.02.42.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jan 2017 02:42:25 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-445946-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-445946-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-445946-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-type; q=dns; s=default; b=Y/uE1U3jZcqlKpah CwlTempZG8Egs29+QGAIShytcHmpCkPYfLgRUHrqOYAX+mawqDDxc2Uns6AmWzn8 ymTaSc/F8S8W7GMK1OqC9GLdORktW+ThsYHczG6o9mJjJou6gMurl3JddtieAkXM BEaQHBOB8CG9HRToFWzXK/Osf/o= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-type; s=default; bh=NPwe6Xld0jlvMD2TGqE/5w gZC+E=; b=tYXMhIvnQL96vKEpQQDsPld6zhlzOuOQzJvOhKEeZsjlU4mz/oC5xF gXFOFTxD9Bw+bkYA25zL/isrRlIEDTXgENRlpabWY+LGZ253+4CB/dcIuwBKoXmB 3LJTILJ+gBLonuRB2VbE7M5ADrKcLK2rUjW+PF10+N0UuT0VwC4PM= Received: (qmail 92487 invoked by alias); 12 Jan 2017 10:42:10 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 92465 invoked by uid 89); 12 Jan 2017 10:42:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.9 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=U*ro, sk:rocebi, sk:ro@cebi, D*Uni-Bielefeld.DE X-HELO: smtp.CeBiTec.Uni-Bielefeld.DE Received: from smtp.CeBiTec.Uni-Bielefeld.DE (HELO smtp.CeBiTec.Uni-Bielefeld.DE) (129.70.160.84) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Jan 2017 10:41:58 +0000 Received: from localhost (localhost.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) by smtp.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTP id 927B58C; Thu, 12 Jan 2017 11:41:56 +0100 (CET) Received: from smtp.CeBiTec.Uni-Bielefeld.DE ([127.0.0.1]) by localhost (malfoy.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) (amavisd-new, port 10024) with LMTP id YF7gDqQ4Qr1c; Thu, 12 Jan 2017 11:41:52 +0100 (CET) Received: from lokon.CeBiTec.Uni-Bielefeld.DE (lokon.CeBiTec.Uni-Bielefeld.DE [129.70.161.152]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPS id 787D28A; Thu, 12 Jan 2017 11:41:52 +0100 (CET) Received: (from ro@localhost) by lokon.CeBiTec.Uni-Bielefeld.DE (8.15.2+Sun/8.15.2/Submit) id v0CAfp6k009481; Thu, 12 Jan 2017 11:41:51 +0100 (MET) From: Rainer Orth To: gcc-patches@gcc.gnu.org Cc: Bruce Korb , Jonathan Wakely Subject: Re: [fixincludes] Only declare gets for C++ < 2014 on Solaris (PR libstdc++/78979) References: Date: Thu, 12 Jan 2017 11:41:51 +0100 In-Reply-To: (Rainer Orth's message of "Thu, 05 Jan 2017 10:47:53 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (usg-unix-v) MIME-Version: 1.0 X-IsSubscribed: yes Rainer Orth writes: > While investigating PR libstdc++/78979, it turns out that Solaris > incorrectly declares std::gets even for C++14 where it's been > removed. This patch fixes that by adding an additional __cplusplus < > 201402L guard via fixincludes. This works for Solaris 12 (and 11), but > Solaris 10 declares the function unconditionally (i.e. without the > __STDC_VERSION__ < 201112L guard and the deprecated attribute), so > another fix adds both to handle that version, too. With this in place, > the std::gets declaration in needs a guard, too. > > While testing this patch together with > > https://gcc.gnu.org/ml/gcc-patches/2017-01/msg00288.html > > it turned out another fix is needed which I'm throwing in here, too: > > declares > > #if defined(_STDC_C11) > extern _Noreturn void quick_exit(int); > #else > extern void quick_exit(int) __NORETURN; > #endif /* _STDC_C11 */ > > and the first one now breaks badly with __STDC_VERSION__ defined to the > C11 value: > > /usr/include/iso/stdlib_c99.h:83:8: error: '_Noreturn' does not name a type > extern _Noreturn void quick_exit(int); > ^~~~~~~~~ > > To avoid this, I've changed to C11-only _Noreturn to > __attribute__((__noreturn__)). > > Bootstrapped without regressions on i386-pc-solaris2.1[02] and > sparc-sun-solaris2.12 and fixing > > FAIL: 27_io/headers/cstdio/functions_neg.cc (test for errors, line 24) > > as designed. fixincludes make check, passes, too. > > Ok for mainline now? I'd like to backport the patch to the gcc-5 and > gcc-6 branches which are equally affected. I just noticed that the submitted patch lacked the _Noreturn part described above. Here it is. Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University # HG changeset patch # Parent 8b946d3b0b1ff1d40660db201feee5925260f9ee Only declare gets for C++ < 2014 on Solaris (PR libstdc++/78979) diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def --- a/fixincludes/inclhack.def +++ b/fixincludes/inclhack.def @@ -3593,6 +3593,43 @@ fix = { }; /* + * Solaris should deprecate gets before C11. + */ +fix = { + hackname = solaris_gets_c11; + mach = "*-*-solaris2*"; + files = "iso/stdio_iso.h"; + select = "(extern char[ \t]*\\*gets\\(char \\*\\));"; + + c_fix = format; + c_fix_arg = "#if __STDC_VERSION__ < 201112L && __cplusplus < 201402L\n" + "%1 __attribute__((__deprecated__));\n" + "#endif"; + + test_text = "extern char *gets(char *);"; +}; + +/* + * Solaris shouldn't declare gets for C++14. + */ +fix = { + hackname = solaris_gets_cxx14; + mach = "*-*-solaris2*"; + files = "iso/stdio_iso.h"; + select = <<- _EOSelect_ +(#if __STDC_VERSION__ < 201112L) +(extern char \*gets\(char \*\) __ATTR_DEPRECATED;) +_EOSelect_; + c_fix = format; + c_fix_arg = "%1 && __cplusplus < 201402L\n%2"; + + test_text = <<- _EOText_ +#if __STDC_VERSION__ < 201112L +extern char *gets(char *) __ATTR_DEPRECATED; +_EOText_; +}; + +/* * Sun Solaris 2 has a version of sys/int_const.h that defines * UINT8_C and UINT16_C to unsigned constants. */ @@ -3982,6 +4019,21 @@ fix = { }; /* + * Solaris shouldn't use std::gets for C++14. + */ +fix = { + hackname = solaris_std_gets_cxx14; + mach = "*-*-solaris2*"; + files = "stdio.h"; + select = "using std::gets;"; + + c_fix = format; + c_fix_arg = "#if __cplusplus < 201402L\n%0\n#endif"; + + test_text = "using std::gets;"; +}; + +/* * Sun Solaris 8 has what appears to be some gross workaround for * some old version of their c++ compiler. G++ doesn't want it * either, but doesn't want to be tied to SunPRO version numbers. @@ -4000,6 +4052,21 @@ fix = { }; /* + * Solaris shouldn't use _Noreturn, breaks with C++. + */ +fix = { + hackname = solaris_stdlib_noreturn; + mach = "*-*-solaris2*"; + files = "iso/stdlib_c99.h"; + select = "(extern) _Noreturn (void quick_exit\\(int\\));"; + + c_fix = format; + c_fix_arg = "%1 %2 __attribute__((__noreturn__));"; + + test_text = "extern _Noreturn void quick_exit(int);"; +}; + +/* * a missing semi-colon at the end of the statsswtch structure definition. */ fix = { diff --git a/fixincludes/tests/base/iso/stdio_iso.h b/fixincludes/tests/base/iso/stdio_iso.h --- a/fixincludes/tests/base/iso/stdio_iso.h +++ b/fixincludes/tests/base/iso/stdio_iso.h @@ -12,3 +12,16 @@ #if defined( SOLARIS_GETC_STRICT_STDC_CHECK ) #if !defined(_REENTRANT) && !defined(_LP64) && (!defined(_STRICT_STDC) || (__cplusplus >= 199711L)) #endif /* SOLARIS_GETC_STRICT_STDC_CHECK */ + + +#if defined( SOLARIS_GETS_C11_CHECK ) +#if __STDC_VERSION__ < 201112L && __cplusplus < 201402L +extern char *gets(char *) __attribute__((__deprecated__)); +#endif +#endif /* SOLARIS_GETS_C11_CHECK */ + + +#if defined( SOLARIS_GETS_CXX14_CHECK ) +#if __STDC_VERSION__ < 201112L && __cplusplus < 201402L +extern char *gets(char *) __ATTR_DEPRECATED; +#endif /* SOLARIS_GETS_CXX14_CHECK */ diff --git a/fixincludes/tests/base/iso/stdlib_c99.h b/fixincludes/tests/base/iso/stdlib_c99.h new file mode 100644 --- /dev/null +++ b/fixincludes/tests/base/iso/stdlib_c99.h @@ -0,0 +1,14 @@ +/* DO NOT EDIT THIS FILE. + + It has been auto-edited by fixincludes from: + + "fixinc/tests/inc/iso/stdlib_c99.h" + + This had to be done to correct non-standard usages in the + original, manufacturer supplied header file. */ + + + +#if defined( SOLARIS_STDLIB_NORETURN_CHECK ) +extern void quick_exit(int) __attribute__((__noreturn__)); +#endif /* SOLARIS_STDLIB_NORETURN_CHECK */ diff --git a/fixincludes/tests/base/stdio.h b/fixincludes/tests/base/stdio.h --- a/fixincludes/tests/base/stdio.h +++ b/fixincludes/tests/base/stdio.h @@ -90,6 +90,13 @@ using std::__flsbuf; #endif /* SOLARIS_STD___FILBUF_CHECK */ +#if defined( SOLARIS_STD_GETS_CXX14_CHECK ) +#if __cplusplus < 201402L +using std::gets; +#endif +#endif /* SOLARIS_STD_GETS_CXX14_CHECK */ + + #if defined( STDIO_STDARG_H_CHECK ) #endif /* STDIO_STDARG_H_CHECK */