From patchwork Tue Oct 10 11:28:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 823799 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-463854-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="WDUoGNdk"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yBFHk2PYxz9t3Z for ; Tue, 10 Oct 2017 22:29:06 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=ehTNUatdIPPEYQtyAmJYDymntI6BmSYIzx3xF+6KBLtma4TziopEf RDVpy+roLzR+JifDxs+s+9ghcikgGVv9bKQr11vyGTT7oBHrfLY6y/2HUG2BvI5N ACKUOSYytbLVL/06JWVbgaqbHsNEDa6Jl79gYdl9OZXAyU0xPr7TZU= 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:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=FSCWh+vuFoYuXDuBQbZc4Gp1gVo=; b=WDUoGNdkVks6BPy11cmS GvzYCq1C7LA5Owh42bJvhZ950jMMDya4odZuIEkMyIlxDmHPQ2f9UeaTg3vWJBSE 1uKvV06UhpxTahzUt770Q4jjB0yu19X1EIs7vhpeGpjmXbjcgrlh4hppjfnoCWab lFiJUw4gxFz1hrGS0to6Dbg= Received: (qmail 40858 invoked by alias); 10 Oct 2017 11:28:48 -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 40700 invoked by uid 89); 10 Oct 2017 11:28:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=imaginary X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Oct 2017 11:28:46 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D64F7E445; Tue, 10 Oct 2017 11:28:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3D64F7E445 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jwakely@redhat.com Received: from localhost (unknown [10.33.36.2]) by smtp.corp.redhat.com (Postfix) with ESMTP id E3B1B60A9B; Tue, 10 Oct 2017 11:28:44 +0000 (UTC) Date: Tue, 10 Oct 2017 12:28:44 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [PATCH] PR libstdc++/82417 do not include C99 in strict modes Message-ID: <20171010112844.GA28974@redhat.com> MIME-Version: 1.0 Content-Disposition: inline X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.9.1 (2017-09-22) As an extension the C++ version of includes the C version, but that defines macros with non-reserved names that should not be defined in ISO C++. Only include the C header for non-strict modes, or for pre-C++11 (because C++98 doesn't mention at all). PR libstdc++/59087 PR libstdc++/82417 * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do not include C library's . * testsuite/26_numerics/complex/c99.cc: Depend on __STRICT_ANSI__. * testsuite/26_numerics/headers/complex.h/std_c++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_gnu++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_c++98.h: New test. Tested powerpc64le-linux, committed to trunk. commit fb0385e979610a025d4b42e0b78f54447c799946 Author: redi Date: Tue Oct 10 11:25:45 2017 +0000 PR libstdc++/82417 do not include C99 in strict modes As an extension the C++ version of includes the C version, but that defines macros with non-reserved names that should not be defined in ISO C++. Only include the C header for non-strict modes, or for pre-C++11 (because C++98 doesn't mention at all). PR libstdc++/59087 PR libstdc++/82417 * include/c_compatibility/complex.h [!C++98 && __STRICT_ANSI__]: Do not include C library's . * testsuite/26_numerics/complex/c99.cc: Depend on __STRICT_ANSI__. * testsuite/26_numerics/headers/complex.h/std_c++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_gnu++11.h: New test. * testsuite/26_numerics/headers/complex.h/std_c++98.h: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@253581 138bc75d-0d04-0410-961f-82ee72b054a4 diff --git a/libstdc++-v3/include/c_compatibility/complex.h b/libstdc++-v3/include/c_compatibility/complex.h index b9af8472562..4b2343926ef 100644 --- a/libstdc++-v3/include/c_compatibility/complex.h +++ b/libstdc++-v3/include/c_compatibility/complex.h @@ -32,7 +32,9 @@ # include #endif -#if _GLIBCXX_HAVE_COMPLEX_H +#if __cplusplus >= 201103L && defined(__STRICT_ANSI__) +// For strict modes do not include the C library's , see PR 82417. +#elif _GLIBCXX_HAVE_COMPLEX_H # include_next # ifdef _GLIBCXX_COMPLEX // See PR56111, keep the macro in C++03 if possible. diff --git a/libstdc++-v3/testsuite/26_numerics/complex/c99.cc b/libstdc++-v3/testsuite/26_numerics/complex/c99.cc index 70189627ca2..9b0def408c8 100644 --- a/libstdc++-v3/testsuite/26_numerics/complex/c99.cc +++ b/libstdc++-v3/testsuite/26_numerics/complex/c99.cc @@ -26,7 +26,8 @@ int main() { -#if _GLIBCXX_HAVE_COMPLEX_H +#if _GLIBCXX_HAVE_COMPLEX_H && !defined(__STRICT_ANSI__) + // This is a GNU extension. double _Complex x = .5; double _Complex y = cacos (x); (void)y; diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h new file mode 100644 index 00000000000..22d84b2f14e --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++11.h @@ -0,0 +1,33 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=c++11" } + +#include + +// Should be equivalent to #include +template class std::complex; + +#ifdef complex +# error "'complex' is defined as a macro by for -std=c++11" +#endif +#ifdef imaginary +# error "'imaginary' is defined as a macro by for -std=c++11" +#endif +#ifdef I +# error "'I' is defined as a macro by for -std=c++11" +#endif diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h new file mode 100644 index 00000000000..62674466c3d --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_c++98.h @@ -0,0 +1,55 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=c++98" } + +#include + +// Should be equivalent to C99 , not C++ +namespace std +{ + struct complex; +} + +#if _GLIBCXX_HAVE_COMPLEX_H +namespace test +{ + using ::cacos; + using ::casin; + using ::catan; + using ::ccos; + using ::csin; + using ::ctan; + using ::ccosh; + using ::csinh; + using ::ctanh; + using ::cexp; + using ::clog; + using ::cabs; + using ::cpow; + using ::csqrt; + using ::carg; + using ::cimag; + using ::conj; + using ::cproj; + using ::creal; +} +#endif + +#ifndef complex +# error "'complex' is not defined as a macro by for -std=c++98" +#endif diff --git a/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h new file mode 100644 index 00000000000..9110ae4ecb2 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/complex.h/std_gnu++11.h @@ -0,0 +1,52 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } + +#include + +// Should be equivalent to #include +template class std::complex; + +#if _GLIBCXX_HAVE_COMPLEX_H +namespace test +{ + using ::cacos; + using ::casin; + using ::catan; + using ::ccos; + using ::csin; + using ::ctan; + using ::ccosh; + using ::csinh; + using ::ctanh; + using ::cexp; + using ::clog; + using ::cabs; + using ::cpow; + using ::csqrt; + using ::carg; + using ::cimag; + using ::conj; + using ::cproj; + using ::creal; +} +#endif + +#ifdef complex +# error "'complex' is defined as a macro by for -std=gnu++11" +#endif