From patchwork Tue Jan 30 12:07:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Cohen X-Patchwork-Id: 194139 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2087:b0:106:209c:c626 with SMTP id gs7csp1190838dyb; Tue, 30 Jan 2024 04:42:26 -0800 (PST) X-Google-Smtp-Source: AGHT+IG8pzaSPlBW2fFo9Okm+tp3GbUGb2JBJ4vchOI5dp4Y9TOe+Svl3xQBqVE6bEeJecWl1JMv X-Received: by 2002:ac8:590a:0:b0:42a:ad63:6d9a with SMTP id 10-20020ac8590a000000b0042aad636d9amr3283156qty.46.1706618546578; Tue, 30 Jan 2024 04:42:26 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706618546; cv=pass; d=google.com; s=arc-20160816; b=W0AbFgvCOCv0NU22yAbisv+dCgjSKPMpgpUhmwxBV++0Bzs3QSDpxGJxerjfr1NTBY 9EVdURIc8Okn6vlgu7tvvtPc7eXXOxEcK7lQCRUT1c+XuLsY3LQCs2qpbYLqLuLddhFb pVFrbyws9UpBp3S77FIV9hil5XiyxDrzaZw75qFhDENX34zn+d6G001aHVcV8M2bnjz5 2OG8l2xV/4kcYfM93xk+WypBdGniKEO1uIEE77polGq1vVNeg4D2TmaN/vhaRsaXmuAd hy4nSLk/hOXUnuxS9dAjt348W+GpasNXx3YA6UOccztvd6PWaGBCP4wkyWDa9YWtY6kx C8pQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:reply-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=68WMY4jrcyoPhBn1QT8vXv+k/05gWCRQvjPh9e/caLg=; fh=s1GzlUPo1djGkCl3rkRJI30hDOSCVwGp0RAbVwQ8dxQ=; b=kQFBm9vyr/YfViVNjsZhPbRKRuetWrj5YLQdyr+wBHQmUsA6gZcrILEw5MpgFdt9Gq u8vkWgdGaZ+qy6ZnEPpNub1SLlCEb8GxJLTvMFTwDpARcB6m5h2mm40YmwyqttLEQin7 5lro2SaGs6d6yXnZ1N5Tr9ydZSNU1eqqWlXUxys+fMoUDTV0Thw+qXdyDa1h4BrEH40y J1JHFJbyTJyuzA/9lAmuYnW0GvElhFrlJ64X0kQ/ZoG36fru8MhzNE9orwBJzx8Fg/8F v4JOkMFyuC7J/8yZDVK4QAdz1gDg02WESRUzMx1oe2gRM7C3L7sT42UhOtv0pExXzUel DUIQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@embecosm.com header.s=google header.b=AV6YGX5W; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id q19-20020a05622a04d300b0042aaa53f36dsi3322967qtx.573.2024.01.30.04.42.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jan 2024 04:42:26 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@embecosm.com header.s=google header.b=AV6YGX5W; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E31F43870C1D for ; Tue, 30 Jan 2024 12:41:32 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by sourceware.org (Postfix) with ESMTPS id 01D2C3857BA4 for ; Tue, 30 Jan 2024 12:11:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 01D2C3857BA4 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 01D2C3857BA4 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::329 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706616722; cv=none; b=Q+s/KP7Yp5G7Uqwj4itcvZxZNcLKDOniYMSNO/cUITZHya0IUYFgn7hExEaqmNrTuVFhH78BJ/wR2DaSEYtQZciX3B2h6clNhqLbT/nH0p3qbjRJ+Auqetmzw9x3Hr2TAJTkdii5544+rO5oja+BF6s6bH11IGQpgnMWbSrcLHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706616722; c=relaxed/simple; bh=ZZiU6ir37XgyF9L68GEEOPIt6WSIFhkr+k2BJitye68=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=llSODf1fHaZs0IOnYtlk6biGZMrxWFEaRbo0OvPlm3eo+o1SxTEnWxBywbx440VdYaoKKBawhGfF4+XvB+DQM3n4NQmsQ8CnziFM66miROVt+BVkNS9wjZahQKhb+yzbmuTQQMBqp2QO0wPrkOU51HPYjM23IN5H5I827MFS7qY= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-40ef64d8955so18169575e9.3 for ; Tue, 30 Jan 2024 04:11:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1706616688; x=1707221488; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=68WMY4jrcyoPhBn1QT8vXv+k/05gWCRQvjPh9e/caLg=; b=AV6YGX5W37mRXCRBRbI1h0AkQUz5gVr0YJtEzO4R6WCnJ5XCVEhDmvON3R8jMlDZ2+ 3YYvVQ+J1UCnqEdsXzLCzzjYJgPw7jBbkoefAv61+R+zZy1YLwkIEeSI2+XAP5Ucue/b 2VBZerSLWINC7BD/btZkVr3dVDqWWpt1F0Gs9u/kdSio8vUMNr+QVaOkIuhgZMdBk/nt 1z11u44cdmBl5x7DiTilODfF80hJG0WAWiNly3A9HoyUv2bwhF/cmEhsEmPQ+nPP3KJn Nzjc2rrzZMYdj9Ej+jJJ7JlxRv840tO3rCMXat1pPTA71RATtwEx3L3ohGcSfTLiyicC Hlwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706616688; x=1707221488; h=content-transfer-encoding:mime-version:reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=68WMY4jrcyoPhBn1QT8vXv+k/05gWCRQvjPh9e/caLg=; b=Ypr/FfwgUmhiGbMfiXBuOw+QZaT4d4zi1xJGUV167GZHR61xQvcp/Gfx01l9A8t1ml 2nuyA6CFea0v4opPfSzUsX1bTWAxqe0gEHujOZ9rkVjSTbXLhUoiDXi8gf7PGdk8vIr5 fFti7Nkh9Izpk0pYLEot3Q/P9yRRT3uhzi6fd4QKkRMYTDmxU+n+4TSvbNhsNISn/z4/ OgnSgdcje3uRZDs6XUFFgbzEHGoQs0pCQAXZV6/F9CPqBzSVsq9bPxpeEOLWhY5Q+6Kn q+QsiIE74Dpr1HADB82kTgzVCKyDNEJI0ytHb6fOU35CJYSVBd7gAxwosNq7BUsU8o3Q nqsg== X-Gm-Message-State: AOJu0YyrCPeL9FTK5IlckNfcJ1Yjoju9N2YQ5o6QxVsrSXqf5wtLEzby Hfl65/xZ6MyLhGon+Qk8/ykUK1bvbfSfV88eX9Fy99Naa2SNEWSl9lWM7Vys/rFmrOgjF3x2ueL GRA== X-Received: by 2002:adf:cd03:0:b0:33a:fc8c:1dc9 with SMTP id w3-20020adfcd03000000b0033afc8c1dc9mr918422wrm.32.1706616687965; Tue, 30 Jan 2024 04:11:27 -0800 (PST) Received: from platypus.localdomain ([62.23.166.218]) by smtp.gmail.com with ESMTPSA id f9-20020a056000036900b00339307d9d31sm10569894wrf.112.2024.01.30.04.11.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jan 2024 04:11:27 -0800 (PST) From: arthur.cohen@embecosm.com To: gcc-patches@gcc.gnu.org Cc: gcc-rust@gcc.gnu.org, Pierre-Emmanuel Patry Subject: [COMMITTED 051/101] gccrs: Split async and const function qualifiers Date: Tue, 30 Jan 2024 13:07:07 +0100 Message-ID: <20240130121026.807464-54-arthur.cohen@embecosm.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20240130121026.807464-2-arthur.cohen@embecosm.com> References: <20240130121026.807464-2-arthur.cohen@embecosm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=unavailable 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: arthur.cohen@embecosm.com Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789519249171046387 X-GMAIL-MSGID: 1789519249171046387 From: Pierre-Emmanuel Patry A function cannot be both async and const, however this should not be handled in the parser but rather at a later stage in the compiler. This commit change the AsyncConstStatus in the AST and the HIR to allows a function to be both async and const. gcc/rust/ChangeLog: * ast/rust-ast-builder.cc (AstBuilder::fn_qualifiers): Change constructor to match the new arguments. * ast/rust-ast-collector.cc (TokenCollector::visit): Change behavior to handle both const and async specifiers at the same time. * ast/rust-ast.cc (FunctionQualifiers::as_string): Likewise. * ast/rust-item.h (class FunctionQualifiers): Remove AsyncConstStatus and replace it with both Async and Const status. Also change the safety arguments to use an enum instead of a boolean. * hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_qualifiers): Update constructor call. * hir/tree/rust-hir-item.h: Add Const and Async status, remove AsyncConstStatus, update the constructor. * hir/tree/rust-hir.cc (FunctionQualifiers::as_string): Update with the new status. * parse/rust-parse-impl.h (Parser::parse_function_qualifiers): Update constructor call. * util/rust-common.h (enum Mutability): Make an enum class. (enum class): Add Async and Const enum class to avoid booleans. (enum Unsafety): Change to an enum class. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/ast/rust-ast-builder.cc | 2 +- gcc/rust/ast/rust-ast-collector.cc | 16 +++------- gcc/rust/ast/rust-ast.cc | 21 ++++--------- gcc/rust/ast/rust-item.h | 22 ++++++++------ gcc/rust/hir/rust-ast-lower-base.cc | 3 +- gcc/rust/hir/tree/rust-hir-item.h | 14 +++++---- gcc/rust/hir/tree/rust-hir.cc | 25 ++++------------ gcc/rust/parse/rust-parse-impl.h | 46 +++++++++++++++++------------ gcc/rust/util/rust-common.h | 16 ++++++++-- 9 files changed, 80 insertions(+), 85 deletions(-) diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc index e2d3eea6c58..fd6f519fa25 100644 --- a/gcc/rust/ast/rust-ast-builder.cc +++ b/gcc/rust/ast/rust-ast-builder.cc @@ -46,7 +46,7 @@ AstBuilder::tuple_idx (std::string receiver, int idx) FunctionQualifiers AstBuilder::fn_qualifiers () { - return FunctionQualifiers (loc, AsyncConstStatus::NONE, false); + return FunctionQualifiers (loc, Async::No, Const::No, Unsafety::Normal); } PathExprSegment diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc index 3e3a959578e..647724bec11 100644 --- a/gcc/rust/ast/rust-ast-collector.cc +++ b/gcc/rust/ast/rust-ast-collector.cc @@ -317,18 +317,10 @@ TokenCollector::visit (FunctionQualifiers &qualifiers) // `const`? `async`? `unsafe`? (`extern` Abi?)? // unsafe? (extern Abi?)? - switch (qualifiers.get_const_status ()) - { - case NONE: - break; - case CONST_FN: - push (Rust::Token::make (CONST, qualifiers.get_locus ())); - break; - case ASYNC_FN: - push (Rust::Token::make (ASYNC, qualifiers.get_locus ())); - break; - } - + if (qualifiers.is_async ()) + push (Rust::Token::make (ASYNC, qualifiers.get_locus ())); + if (qualifiers.is_const ()) + push (Rust::Token::make (CONST, qualifiers.get_locus ())); if (qualifiers.is_unsafe ()) push (Rust::Token::make (UNSAFE, qualifiers.get_locus ())); if (qualifiers.is_extern ()) diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 17f82d67430..607f07955d4 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -2333,22 +2333,11 @@ FunctionQualifiers::as_string () const { std::string str; - switch (const_status) - { - case NONE: - // do nothing - break; - case CONST_FN: - str += "const "; - break; - case ASYNC_FN: - str += "async "; - break; - default: - return "ERROR_MARK_STRING: async-const status failure"; - } - - if (has_unsafe) + if (is_async ()) + str += "async "; + if (is_const ()) + str += "const "; + if (is_unsafe ()) str += "unsafe "; if (has_extern) diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index b34aca0d56c..9a83f3d5981 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -533,19 +533,20 @@ public: // Qualifiers for function, i.e. const, unsafe, extern etc. class FunctionQualifiers { - AsyncConstStatus const_status; - bool has_unsafe; + Async async_status; + Const const_status; + Unsafety unsafe_status; bool has_extern; std::string extern_abi; location_t locus; public: - FunctionQualifiers (location_t locus, AsyncConstStatus const_status, - bool has_unsafe, bool has_extern = false, + FunctionQualifiers (location_t locus, Async async_status, Const const_status, + Unsafety unsafe_status, bool has_extern = false, std::string extern_abi = std::string ()) - : const_status (const_status), has_unsafe (has_unsafe), - has_extern (has_extern), extern_abi (std::move (extern_abi)), - locus (locus) + : async_status (async_status), const_status (const_status), + unsafe_status (unsafe_status), has_extern (has_extern), + extern_abi (std::move (extern_abi)), locus (locus) { if (!this->extern_abi.empty ()) { @@ -556,11 +557,14 @@ public: std::string as_string () const; - AsyncConstStatus get_const_status () const { return const_status; } - bool is_unsafe () const { return has_unsafe; } + bool is_unsafe () const { return unsafe_status == Unsafety::Unsafe; } bool is_extern () const { return has_extern; } + bool is_const () const { return const_status == Const::Yes; } + bool is_async () const { return async_status == Async::Yes; } std::string get_extern_abi () const { return extern_abi; } bool has_abi () const { return !extern_abi.empty (); } + Const get_const_status () const { return const_status; } + Async get_async_status () const { return async_status; } location_t get_locus () const { return locus; } }; diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc index f5eed256a5e..f8438557707 100644 --- a/gcc/rust/hir/rust-ast-lower-base.cc +++ b/gcc/rust/hir/rust-ast-lower-base.cc @@ -721,7 +721,8 @@ ASTLoweringBase::lower_qualifiers (const AST::FunctionQualifiers &qualifiers) "invalid ABI: found %qs", extern_abi.c_str ()); } - return HIR::FunctionQualifiers (qualifiers.get_const_status (), unsafety, + return HIR::FunctionQualifiers (qualifiers.get_async_status (), + qualifiers.get_const_status (), unsafety, has_extern, abi); } diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index 6cd41892e49..f72d8c8b050 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -481,24 +481,26 @@ public: struct FunctionQualifiers { private: - AsyncConstStatus const_status; + Async async_status; + Const const_status; Unsafety unsafety; bool has_extern; ABI abi; public: - FunctionQualifiers (AsyncConstStatus const_status, Unsafety unsafety, + FunctionQualifiers (Async async_status, Const const_status, Unsafety unsafety, bool has_extern, ABI abi) - : const_status (const_status), unsafety (unsafety), has_extern (has_extern), - abi (abi) + : async_status (async_status), const_status (const_status), + unsafety (unsafety), has_extern (has_extern), abi (abi) {} std::string as_string () const; - AsyncConstStatus get_status () const { return const_status; } + Const get_const_status () const { return const_status; } - bool is_const () const { return const_status == AsyncConstStatus::CONST_FN; } + bool is_const () const { return const_status == Const::Yes; } bool is_unsafe () const { return unsafety == Unsafety::Unsafe; } + bool is_async () const { return async_status == Async::Yes; } ABI get_abi () const { return abi; } }; diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc index 66f626ba845..fb0a9c388ae 100644 --- a/gcc/rust/hir/tree/rust-hir.cc +++ b/gcc/rust/hir/tree/rust-hir.cc @@ -1947,25 +1947,12 @@ FunctionQualifiers::as_string () const { std::string str; - switch (const_status) - { - case NONE: - // do nothing - break; - case CONST_FN: - str += "const "; - break; - case ASYNC_FN: - str += "async "; - break; - default: - return "ERROR_MARK_STRING: async-const status failure"; - } - - if (unsafety == Unsafety::Unsafe) - { - str += "unsafe "; - } + if (is_const ()) + str += "const "; + if (is_async ()) + str += "async "; + if (is_unsafe ()) + str += "unsafe "; if (has_extern) { diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index a9af7dc3f38..a1ad4f11993 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -24,6 +24,7 @@ #include "rust-common.h" #include "rust-item.h" +#include "rust-common.h" #include "rust-token.h" #define INCLUDE_ALGORITHM #include "rust-diagnostics.h" @@ -2987,33 +2988,40 @@ template AST::FunctionQualifiers Parser::parse_function_qualifiers () { - AsyncConstStatus const_status = NONE; - bool has_unsafe = false; + Async async_status = Async::No; + Const const_status = Const::No; + Unsafety unsafe_status = Unsafety::Normal; bool has_extern = false; std::string abi; + const_TokenPtr t; + location_t locus; // Check in order of const, unsafe, then extern - const_TokenPtr t = lexer.peek_token (); - location_t locus = t->get_locus (); - switch (t->get_id ()) + for (int i = 0; i < 2; i++) { - case CONST: - lexer.skip_token (); - const_status = CONST_FN; - break; - case ASYNC: - lexer.skip_token (); - const_status = ASYNC_FN; - break; - default: - // const status is still none - break; + t = lexer.peek_token (); + locus = t->get_locus (); + + switch (t->get_id ()) + { + case CONST: + lexer.skip_token (); + const_status = Const::Yes; + break; + case ASYNC: + lexer.skip_token (); + async_status = Async::Yes; + break; + default: + // const status is still none + break; + } } if (lexer.peek_token ()->get_id () == UNSAFE) { lexer.skip_token (); - has_unsafe = true; + unsafe_status = Unsafety::Unsafe; } if (lexer.peek_token ()->get_id () == EXTERN_KW) @@ -3030,8 +3038,8 @@ Parser::parse_function_qualifiers () } } - return AST::FunctionQualifiers (locus, const_status, has_unsafe, has_extern, - std::move (abi)); + return AST::FunctionQualifiers (locus, async_status, const_status, + unsafe_status, has_extern, std::move (abi)); } // Parses generic (lifetime or type) params inside angle brackets (optional). diff --git a/gcc/rust/util/rust-common.h b/gcc/rust/util/rust-common.h index fc8ba6e1e58..299ae71e909 100644 --- a/gcc/rust/util/rust-common.h +++ b/gcc/rust/util/rust-common.h @@ -25,18 +25,30 @@ namespace Rust { -enum Mutability +enum class Mutability { Imm, Mut }; -enum Unsafety +enum class Unsafety { Unsafe, Normal }; +enum class Const +{ + Yes, + No, +}; + +enum class Async +{ + Yes, + No +}; + enum BoundPolarity { RegularBound,