From patchwork Wed Aug 27 14:55:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ed Smith-Rowland <3dw4rd@verizon.net> X-Patchwork-Id: 383473 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 9C56914009C for ; Thu, 28 Aug 2014 00:56:13 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=WI8lpKsn7VpTkSlayr+MIhgZr2Iq45gWLHkBQPcIXWD05S duwEymrLgyQ2pTTdrGpQeFqxS6TW+azAtKC8VdnrUEES7du0zutIpGzx1ySZAJsz UwyJ6V0SJhL48zthxuCSPsbr+KP4ALcJVhr3juDYT8F3jePJi3UVBLhCAbA2E= 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 :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=De1UjPKbdaEwkkqUmHkfZZydkpI=; b=SU6TugHZIb1u9jqis86O gzuvRpjfRwGu9ghMIZLkFAD54c2Ltg9nlyVJEbrdZ9de1gep6mSQF5DFVLXs7nr+ A2ydSnrNABV2U16bfKAfo16AG5xyOV5lsR4X8fMq+SZXh85SE6iVpZuBRnZw9EFl Ybe//MSd3gCTvTwJoRkMcpg= Received: (qmail 7502 invoked by alias); 27 Aug 2014 14:56:00 -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 7480 invoked by uid 89); 27 Aug 2014 14:56:00 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 3 recipients X-HELO: vms173001pub.verizon.net Received: from vms173001pub.verizon.net (HELO vms173001pub.verizon.net) (206.46.173.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 27 Aug 2014 14:55:58 +0000 Received: from [192.168.1.4] ([unknown] [173.69.187.187]) by vms173001.mailsrvcs.net (Sun Java(tm) System Messaging Server 7u2-7.02 32bit (built Apr 16 2009)) with ESMTPA id <0NAZ00CGI04WWL00@vms173001.mailsrvcs.net>; Wed, 27 Aug 2014 09:55:45 -0500 (CDT) Message-id: <53FDF170.7080208@verizon.net> Date: Wed, 27 Aug 2014 10:55:44 -0400 From: Ed Smith-Rowland <3dw4rd@verizon.net> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-version: 1.0 To: gcc-patches , jsm28@gcc.gnu.org, Jason Merrill , pinskia@gcc.gnu.org Subject: [PATCH, CPP/23827] standard C++ should not have hex float preprocessing tokens Content-type: multipart/mixed; boundary=------------010107010401060103070402 This old one says the C++98 ANSI doesn't have hex float literals and should error gracefully. Fixed by changing a language feature flag as suggested by the audit trail and by adding an error message. Built and tested on x86_64-linux. OK? libcpp/ 2014-08-27 Edward Smith-Rowland <3dw4rd@verizon.net> PR cpp/23827 - standard C++ should not have hex float preprocessor tokens * libcpp/init.c (lang_flags): Change CXX98 flag for extended numbers from 1 to 0. * libcpp/expr.c (cpp_classify_number): Weite error message for improper use of hex floating literal. gcc/testsuite/ 2014-08-27 Edward Smith-Rowland <3dw4rd@verizon.net> PR cpp/23827 - standard C++ should not have hex float preprocessor tokens * g++.dg/cpp/pr23827_cxx11.C: New. * g++.dg/cpp/pr23827_cxx98.C: New. * g++.dg/cpp/pr23827_cxx98_neg.C: New. * gcc.dg/cpp/pr23827_c90.c: New. * gcc.dg/cpp/pr23827_c90_neg.c: New. * gcc.dg/cpp/pr23827_c99.c: New. Index: libcpp/init.c =================================================================== --- libcpp/init.c (revision 214556) +++ libcpp/init.c (working copy) @@ -103,7 +103,7 @@ /* STDC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, - /* CXX98 */ { 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, + /* CXX98 */ { 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* GNUCXX11 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0 }, /* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }, /* GNUCXX14 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0 }, Index: libcpp/expr.c =================================================================== --- libcpp/expr.c (revision 214556) +++ libcpp/expr.c (working copy) @@ -540,9 +540,16 @@ SYNTAX_ERROR_AT (virtual_location, "no digits in hexadecimal floating constant"); - if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99)) - cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, - "use of C99 hexadecimal floating constant"); + if (radix == 16 && CPP_PEDANTIC (pfile) + && !CPP_OPTION (pfile, extended_numbers)) + { + if (CPP_OPTION (pfile, cplusplus)) + cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, + "use of C++11 hexadecimal floating constant"); + else + cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, + "use of C99 hexadecimal floating constant"); + } if (float_flag == AFTER_EXPON) { Index: gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C =================================================================== --- gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C (revision 0) +++ gcc/testsuite/g++.dg/cpp/pr23827_cxx11.C (working copy) @@ -0,0 +1,23 @@ +// { dg-do run { target c++11 } } +// { dg-options "-pedantic-errors" } + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +// C90 and C++98: "0x1p+( 0x1p+)" +// C99 and C++11: "0x1p+f 0x1p+l" +const char *s = xstr(0x1p+f 0x1p+l); + +extern "C" void abort (void); +extern "C" int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + return 0; // Correct C99 and C++11 behavior. + else + abort (); // Correct C90 and C++ behavior. +} Index: gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C =================================================================== --- gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C (revision 0) +++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98.C (working copy) @@ -0,0 +1,23 @@ +// { dg-do run { target c++98_only } } +// { dg-options "-ansi -pedantic-errors" } + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +// C90 and C++98: "0x1p+( 0x1p+)" +// C99 and C++11: "0x1p+f 0x1p+l" +const char *s = xstr(0x1p+f 0x1p+l); + +extern "C" void abort (void); +extern "C" int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + abort (); // Correct C99 and C++11 behavior. + else + return 0; // Correct C90 and C++ behavior. +} Index: gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C =================================================================== --- gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C (revision 0) +++ gcc/testsuite/g++.dg/cpp/pr23827_cxx98_neg.C (working copy) @@ -0,0 +1,4 @@ +// { dg-do compile { target c++98_only } } +/* { dg-options "-ansi -pedantic-errors" } */ + +double x = 0x3.1415babep0; // { dg-error "use of C..11 hexadecimal floating constant" } Index: gcc/testsuite/gcc.dg/cpp/pr23827_c90.c =================================================================== --- gcc/testsuite/gcc.dg/cpp/pr23827_c90.c (revision 0) +++ gcc/testsuite/gcc.dg/cpp/pr23827_c90.c (working copy) @@ -0,0 +1,23 @@ +/* { dg-do run } */ +/* { dg-options "-std=c90 -pedantic-errors" } */ + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +/* C90 and C++98: "0x1p+( 0x1p+)" */ +/* C99 and C++11: "0x1p+f 0x1p+l" */ +const char *s = xstr(0x1p+f 0x1p+l); + +void abort (void); +int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + abort (); /* Correct C99 and C++11 behavior. */ + else + return 0; /* Correct C90 and C++ behavior. */ +} Index: gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c =================================================================== --- gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c (revision 0) +++ gcc/testsuite/gcc.dg/cpp/pr23827_c90_neg.c (working copy) @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c90 -pedantic-errors" } */ + +double x = 0x3.1415babep0; /* { dg-error "use of C99 hexadecimal floating constant" } */ Index: gcc/testsuite/gcc.dg/cpp/pr23827_c99.c =================================================================== --- gcc/testsuite/gcc.dg/cpp/pr23827_c99.c (revision 0) +++ gcc/testsuite/gcc.dg/cpp/pr23827_c99.c (working copy) @@ -0,0 +1,23 @@ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-pedantic-errors" } */ + +#define f ( +#define l ) +#define str(x) #x +#define xstr(x) str(x) + +/* C90 and C++98: "0x1p+( 0x1p+)" */ +/* C99 and C++11: "0x1p+f 0x1p+l" */ +const char *s = xstr(0x1p+f 0x1p+l); + +void abort (void); +int strcmp (const char *, const char *); + +int +main() +{ + if (strcmp (s, "0x1p+( 0x1p+)")) + return 0; /* Correct C99 and C++11 behavior. */ + else + abort (); /* Correct C90 and C++ behavior. */ +}