From patchwork Mon Aug 1 23:34:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 340 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:6a10:b5d6:b0:2b9:3548:2db5 with SMTP id v22csp2635921pxt; Mon, 1 Aug 2022 16:36:16 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sd/ivVh0UIWBHKyIAKZEiXxxm7CDXNVzUBINTIh08WdjcGidTG5ctQTUdNfdrvMPEMr7zA X-Received: by 2002:a17:907:c27:b0:72b:8118:b899 with SMTP id ga39-20020a1709070c2700b0072b8118b899mr14153535ejc.739.1659396976730; Mon, 01 Aug 2022 16:36:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659396976; cv=none; d=google.com; s=arc-20160816; b=SlhOZ35IGgb3kTaQBxNSCBNMhu9xOus351V1cQSlMjSLbAM7s105q7mgI1l2vnU/tv SpPb+Nxj6u4+hxPETZWwu+e9dQOlqi0HJLLkhrxcoFgKRlhHDdmz1Y+LuSSxnPW4LBGh sKJMANhKUwyb2leYc8TLVbXfdOPb6EF/xGHkHctbDQYyuToRfdEwNu6oyySjGdPawaKM o8kdr2m9Jf3BXdIHjTIi6oRK62A0153mgYkn9jDWz6FXsXz5jEPargj3k4nYyl6r3iAS hlFI3x4rk1zogIJk1ansV08JQ1iXaFFxswKCnKz+sFTEMV9l72E0pf5oYoN5fjYF7pvW 639A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:to :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=9ShyoJFQOfCUD1KMCG9B78jXXRZ0c+rq6OOPGQaO7jw=; b=av5QRJf5JakooWyucM/0yr2ZcO/jQaN+ceP1jJChBkQ8cZfC+8ynNzMQCrkUCIUM8X Wnjr9b/jTp+QDcSoIoUPvpEuIRmdUTKNESbuMUDk2NKjK6b8mnc0ba5vmRnLr3KAMlls zbL8XMJPyljUaqyIaDRACYJWfykLMkHM/t5B7b5mewcRdN9spI5H0MF7fH5gihFdQl7l Kayk7+SZ1JfKO9MF6KuMX+9pwC2nHeR0It2gwwwrSiWxMOhjYMhk1XA+5ItcELGETMPY M+fQfeac71FRxNkoehM7tMh/as0JVJiXCwoZmE5djP4hWQMc35itHVmUD3SuiRtqsyW8 KmhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=qYQEUmHi; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id m22-20020a50d7d6000000b0043a25094b50si11289226edj.552.2022.08.01.16.36.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Aug 2022 16:36:16 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=qYQEUmHi; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 32F9F3857C75 for ; Mon, 1 Aug 2022 23:36:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 32F9F3857C75 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1659396975; bh=9ShyoJFQOfCUD1KMCG9B78jXXRZ0c+rq6OOPGQaO7jw=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=qYQEUmHiVvXMEbv6JPj/4M03YdHWhizERJfx7hNUx9CrOBnzo7PjO/xbX5NwoRrjH ED0HVY2TfJZ9mxx8BL81anwm44XpDA92mFO1k1t0AiWOOm7jKGyN5b4VT1nTe0MVXS Aa2oyYBuscansylLAhupxs4PZtBPncKkKUTUcnGo= 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.133.124]) by sourceware.org (Postfix) with ESMTPS id DDF9A3858032 for ; Mon, 1 Aug 2022 23:34:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DDF9A3858032 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-244-ONzJnmlkN3OAKJTjdFwUsA-1; Mon, 01 Aug 2022 19:34:27 -0400 X-MC-Unique: ONzJnmlkN3OAKJTjdFwUsA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5D2BB101A588 for ; Mon, 1 Aug 2022 23:34:27 +0000 (UTC) Received: from t14s.localdomain.com (unknown [10.2.16.236]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2D0001400C30; Mon, 1 Aug 2022 23:34:27 +0000 (UTC) To: gcc-patches@gcc.gnu.org Subject: [committed] c: improvements to address space diagnostics Date: Mon, 1 Aug 2022 19:34:25 -0400 Message-Id: <20220801233425.2530853-1-dmalcolm@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 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, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: David Malcolm via Gcc-patches From: David Malcolm Reply-To: David Malcolm Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1740003844341337135?= X-GMAIL-MSGID: =?utf-8?q?1740003844341337135?= This adds a clarifying "note" to address space mismatch diagnostics. For example, it improves the diagnostic for gcc.target/i386/addr-space-typeck-2.c from: addr-space-typeck-2.c: In function 'test_bad_call': addr-space-typeck-2.c:12:22: error: passing argument 2 of 'expects_seg_gs' from pointer to non-enclosed address space 12 | expects_seg_gs (0, ptr, 1); | ^~~ to: addr-space-typeck-2.c: In function 'test_bad_call': addr-space-typeck-2.c:12:22: error: passing argument 2 of 'expects_seg_gs' from pointer to non-enclosed address space 12 | expects_seg_gs (0, ptr, 1); | ^~~ addr-space-typeck-2.c:7:51: note: expected '__seg_gs void *' but argument is of type 'void *' 7 | extern void expects_seg_gs (int i, void __seg_gs *param, int j); | ~~~~~~~~~~~~~~~^~~~~ I took the liberty of adding the test coverage to i386 since we need a specific target to test this on. Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to trunk as r13-1922-ge8bc6918b31e63. gcc/c/ChangeLog: * c-typeck.cc (build_c_cast): Quote names of address spaces in diagnostics. (convert_for_assignment): Add a note to address space mismatch diagnostics, specifying the expected and actual types. gcc/testsuite/ChangeLog: * gcc.target/i386/addr-space-typeck-1.c: New test. * gcc.target/i386/addr-space-typeck-2.c: New test. Signed-off-by: David Malcolm --- gcc/c/c-typeck.cc | 27 +++++++++++++------ .../gcc.target/i386/addr-space-typeck-1.c | 22 +++++++++++++++ .../gcc.target/i386/addr-space-typeck-2.c | 25 +++++++++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/addr-space-typeck-1.c create mode 100644 gcc/testsuite/gcc.target/i386/addr-space-typeck-2.c diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index fd0a7f81a7a..8514488b7a5 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -6032,18 +6032,18 @@ build_c_cast (location_t loc, tree type, tree expr) if (!addr_space_superset (as_to, as_from, &as_common)) { if (ADDR_SPACE_GENERIC_P (as_from)) - warning_at (loc, 0, "cast to %s address space pointer " + warning_at (loc, 0, "cast to %qs address space pointer " "from disjoint generic address space pointer", c_addr_space_name (as_to)); else if (ADDR_SPACE_GENERIC_P (as_to)) warning_at (loc, 0, "cast to generic address space pointer " - "from disjoint %s address space pointer", + "from disjoint %qs address space pointer", c_addr_space_name (as_from)); else - warning_at (loc, 0, "cast to %s address space pointer " - "from disjoint %s address space pointer", + warning_at (loc, 0, "cast to %qs address space pointer " + "from disjoint %qs address space pointer", c_addr_space_name (as_to), c_addr_space_name (as_from)); } @@ -7252,6 +7252,8 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, if (!null_pointer_constant_p (rhs) && asr != asl && !targetm.addr_space.subset_p (asr, asl)) { + auto_diagnostic_group d; + bool diagnosed = true; switch (errtype) { case ic_argpass: @@ -7259,7 +7261,8 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, const char msg[] = G_("passing argument %d of %qE from " "pointer to non-enclosed address space"); if (warnopt) - warning_at (expr_loc, warnopt, msg, parmnum, rname); + diagnosed + = warning_at (expr_loc, warnopt, msg, parmnum, rname); else error_at (expr_loc, msg, parmnum, rname); break; @@ -7269,7 +7272,7 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, const char msg[] = G_("assignment from pointer to " "non-enclosed address space"); if (warnopt) - warning_at (location, warnopt, msg); + diagnosed = warning_at (location, warnopt, msg); else error_at (location, msg); break; @@ -7280,7 +7283,7 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, const char msg[] = G_("initialization from pointer to " "non-enclosed address space"); if (warnopt) - warning_at (location, warnopt, msg); + diagnosed = warning_at (location, warnopt, msg); else error_at (location, msg); break; @@ -7290,7 +7293,7 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, const char msg[] = G_("return from pointer to " "non-enclosed address space"); if (warnopt) - warning_at (location, warnopt, msg); + diagnosed = warning_at (location, warnopt, msg); else error_at (location, msg); break; @@ -7298,6 +7301,14 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type, default: gcc_unreachable (); } + if (diagnosed) + { + if (errtype == ic_argpass) + inform_for_arg (fundecl, expr_loc, parmnum, type, rhstype); + else + inform (location, "expected %qT but pointer is of type %qT", + type, rhstype); + } return error_mark_node; } diff --git a/gcc/testsuite/gcc.target/i386/addr-space-typeck-1.c b/gcc/testsuite/gcc.target/i386/addr-space-typeck-1.c new file mode 100644 index 00000000000..84d27b03ef9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/addr-space-typeck-1.c @@ -0,0 +1,22 @@ +/* { dg-options "-std=gnu90" } */ + +void * +test_gs_to_generic (void __seg_gs *p) +{ + return p; /* { dg-error "return from pointer to non-enclosed address space" "error" } */ + /* { dg-message "expected 'void \\*' but pointer is of type '__seg_gs void \\*'" "note" { target *-*-* } .-1 } */ +} + +void __seg_gs * +test_generic_to_gs (void *q) +{ + return q; /* { dg-error "return from pointer to non-enclosed address space" "error" } */ + /* { dg-message "expected '__seg_gs void \\*' but pointer is of type 'void \\*'" "note" { target *-*-* } .-1 } */ +} + +extern void use_double_deref (char __seg_gs **buffer); + +void test_double_deref (char __seg_gs *buf) +{ + use_double_deref (&buf); +} diff --git a/gcc/testsuite/gcc.target/i386/addr-space-typeck-2.c b/gcc/testsuite/gcc.target/i386/addr-space-typeck-2.c new file mode 100644 index 00000000000..d9fb9a7a8ab --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/addr-space-typeck-2.c @@ -0,0 +1,25 @@ +/* Tests of C frontend's address space type-checking. */ +/* { dg-options "-std=gnu90 -fdiagnostics-show-caret" } */ + +/* Verify that we emit helpful diagnostics at a mismatching address space + at a function call, and that the underlined locations are correct. */ + +extern void expects_seg_gs (int i, void __seg_gs *param, int j); /* { dg-line "decl_line" } */ + +void +test_bad_call (void *ptr) +{ + expects_seg_gs (0, ptr, 1); /* { dg-line "err_line" } */ +} + +/* { dg-error "passing argument 2 of 'expects_seg_gs' from pointer to non-enclosed address space" "" { target *-*-* } err_line } */ +/* { dg-begin-multiline-output "" } + expects_seg_gs (0, ptr, 1); + ^~~ + { dg-end-multiline-output "" } */ + +/* { dg-message "expected '__seg_gs void \\*' but argument is of type 'void \\*'" "" { target *-*-* } decl_line } */ +/* { dg-begin-multiline-output "" } + extern void expects_seg_gs (int i, void __seg_gs *param, int j); + ~~~~~~~~~~~~~~~^~~~~ + { dg-end-multiline-output "" } */