From patchwork Wed Mar 30 22:28:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 1611440 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=L0Pbaamm; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KTLht3smFz9sCq for ; Thu, 31 Mar 2022 09:29:49 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1490F384602A for ; Wed, 30 Mar 2022 22:29:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1490F384602A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1648679384; bh=VTMBls2Qqt+QM48FucTy90on9OCEy6QI3XDN+WZ4A8A=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=L0PbaammzP7EHmWVRhor+ZdzyBU0bIdEznEb/joybKqfWEghdLDp9zLy6UjM1xRsz 9alO7kuDutp/R4k1eRyDl4eIS2MHxVMAQX+GBsP8oXjU+I06yWDsrsJ+ehatPswt+S rF/8x1IDwWpwkKP+key+QZwab0nx7wod9DMmGuto= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 E6D683858C2D for ; Wed, 30 Mar 2022 22:29:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E6D683858C2D Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-501-Mj_V_jX0NfWK3Ux53JSPRA-1; Wed, 30 Mar 2022 18:28:59 -0400 X-MC-Unique: Mj_V_jX0NfWK3Ux53JSPRA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D59603C01D93; Wed, 30 Mar 2022 22:28:58 +0000 (UTC) Received: from pdp-11.hsd1.ma.comcast.net (unknown [10.22.33.161]) by smtp.corp.redhat.com (Postfix) with ESMTP id 512432026D65; Wed, 30 Mar 2022 22:28:58 +0000 (UTC) To: GCC Patches , Jason Merrill , Joseph Myers Subject: [PATCH] c-family: Tweak -Woverflow diagnostic Date: Wed, 30 Mar 2022 18:28:53 -0400 Message-Id: <20220330222853.762944-1-polacek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, 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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Marek Polacek via Gcc-patches From: Marek Polacek Reply-To: Marek Polacek Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" When g++ emits warning: overflow in conversion from 'int' to 'char' changes value from '300' to '','' for code like "char c = 300;" it might raise a few eyebrows. With this warning we're not interested in the ASCII representation of the char, only the numerical value, so convert constants of type char to int. It looks like this conversion only needs to be done for char_type_node. Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? I'm also happy to defer this to GCC 13. gcc/c-family/ChangeLog: * c-warn.cc (warnings_for_convert_and_check): Convert constants of type char to int. gcc/testsuite/ChangeLog: * c-c++-common/Wconversion-1.c: New test. --- gcc/c-family/c-warn.cc | 16 +++++++++++----- gcc/testsuite/c-c++-common/Wconversion-1.c | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Wconversion-1.c base-commit: b4e4b35f4ebe561826489bed971324efc99c5423 diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc index f24ac5d0539..cae89294aea 100644 --- a/gcc/c-family/c-warn.cc +++ b/gcc/c-family/c-warn.cc @@ -1404,8 +1404,14 @@ warnings_for_convert_and_check (location_t loc, tree type, tree expr, result = TREE_OPERAND (result, 1); bool cst = TREE_CODE_CLASS (TREE_CODE (result)) == tcc_constant; - tree exprtype = TREE_TYPE (expr); + tree result_diag; + /* We're interested in the actual numerical value here, not its ASCII + representation. */ + if (cst && TYPE_MAIN_VARIANT (TREE_TYPE (result)) == char_type_node) + result_diag = fold_convert (integer_type_node, result); + else + result_diag = result; if (TREE_CODE (expr) == INTEGER_CST && (TREE_CODE (type) == INTEGER_TYPE @@ -1430,7 +1436,7 @@ warnings_for_convert_and_check (location_t loc, tree type, tree expr, "changes value from %qE to %qE") : G_("unsigned conversion from %qT to %qT " "changes value from %qE to %qE")), - exprtype, type, expr, result); + exprtype, type, expr, result_diag); else warning_at (loc, OPT_Woverflow, (TYPE_UNSIGNED (exprtype) @@ -1449,7 +1455,7 @@ warnings_for_convert_and_check (location_t loc, tree type, tree expr, warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " "changes value from %qE to %qE", - exprtype, type, expr, result); + exprtype, type, expr, result_diag); else warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " @@ -1466,7 +1472,7 @@ warnings_for_convert_and_check (location_t loc, tree type, tree expr, warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " "changes value from %qE to %qE", - exprtype, type, expr, result); + exprtype, type, expr, result_diag); else warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " @@ -1483,7 +1489,7 @@ warnings_for_convert_and_check (location_t loc, tree type, tree expr, warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " "changes value from %qE to %qE", - exprtype, type, expr, result); + exprtype, type, expr, result_diag); else warning_at (loc, OPT_Woverflow, "overflow in conversion from %qT to %qT " diff --git a/gcc/testsuite/c-c++-common/Wconversion-1.c b/gcc/testsuite/c-c++-common/Wconversion-1.c new file mode 100644 index 00000000000..ed65918c70f --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wconversion-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-Wconversion" } */ + +typedef char T; + +void g() +{ + char c = 300; /* { dg-warning "conversion from .int. to .char. changes value from .300. to .44." } */ + T t = 300; /* { dg-warning "conversion from .int. to .T. {aka .char.} changes value from .300. to .44." } */ + signed char sc = 300; /* { dg-warning "conversion from .int. to .signed char. changes value from .300. to .44." } */ + unsigned char uc = 300; /* { dg-warning "conversion from .int. to .unsigned char. changes value from .300. to .44." } */ + unsigned char uc2 = 300u; /* { dg-warning "conversion from .unsigned int. to .unsigned char. changes value from .300. to .44." } */ + char c2 = (double)1.0 + 200; /* { dg-warning "overflow in conversion from .double. to .char. changes value from .2.01e\\+2. to .127." } */ +}