From patchwork Wed Jan 26 04:22:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 50448 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 322533851C14 for ; Wed, 26 Jan 2022 04:23:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 322533851C14 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1643170999; bh=iIySvZSXGaMcVSnWdQy448ZajlIP4N7SxNWLHAAdyDA=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=C88Rgwf1Ee64o9POJagb+8RL7KfJH6/Atyl0QgY2bsPGXurrl7/6sPRDG8O10Hjmj hPe/BQZ+wgKW54qx3Mf7N8yYpq0BsRDaMGko96QBjp/zGX8N3KH9T6+eYAYckb9pP3 u/dWBZXIUKM5cNLsx1AXCRlKf01vqyqHx4P1MkB0= 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 308B03858C60 for ; Wed, 26 Jan 2022 04:22:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 308B03858C60 Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-408-MJEFMTBVOk-QL1JnsjtzPQ-1; Tue, 25 Jan 2022 23:22:45 -0500 X-MC-Unique: MJEFMTBVOk-QL1JnsjtzPQ-1 Received: by mail-qk1-f200.google.com with SMTP id u12-20020a05620a0c4c00b00475a9324977so16378205qki.13 for ; Tue, 25 Jan 2022 20:22:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=iIySvZSXGaMcVSnWdQy448ZajlIP4N7SxNWLHAAdyDA=; b=8B/TVM1Hfozygzdrs9WRKQ6Xbkr/4FTjRngM4hH5fNJJAa9CfmYgnq4qd/GCEVmMAN XU4+3dLHTSVrNRRf+2BCY3q2eYqyfJnIlZKgvQV+BO78Qzrpub+mXEFMNhjOHzFACPG1 usSQLOeugtllGmMPGTcuoNNIjAWAlDlQ/5r3dqoOdZSW4oaPx2Etq24jxcjS3qY/MxNe 6cQY9d1Sp4pkTyhoQNlVieOWEtR3Tr5jPf47i8YhLgCw79xpfWw2MZDGZ2WMPqRI3sJF LO6zD9Na62uOGmNPDxMmd41hFUnhyRT/pQ+0f7aBMbzf+ejtgkxvmvBsfFv9rQ72JBD3 bGDQ== X-Gm-Message-State: AOAM532oSfezO8g0V1JZm9btLT4ppR5Ip0dX72M10/SanP3sJ+5p+zSA LxobjGoUXG43EF/oPirU7YF30/xlU8QIeJ1anrO8pEk1TzCUQtYPEavlEqc/U4tZvvyr2EtkWXD MVavkIOYlKhfn7NSjOEgP3JB9CnmYjGEKWQJm/hjIybzS5h2zxHRS8z0DXyJqs7sSpQ== X-Received: by 2002:a05:620a:1a27:: with SMTP id bk39mr3991256qkb.513.1643170964504; Tue, 25 Jan 2022 20:22:44 -0800 (PST) X-Google-Smtp-Source: ABdhPJyi7Vawfe4kTWuitPRtBEzsubvwsrVX7gJQlpxaSRMTCy2ZyqCZD4n07zJvPVSq85zXRkYzfA== X-Received: by 2002:a05:620a:1a27:: with SMTP id bk39mr3991243qkb.513.1643170964055; Tue, 25 Jan 2022 20:22:44 -0800 (PST) Received: from barrymore.redhat.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id bs33sm1990341qkb.103.2022.01.25.20.22.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 20:22:43 -0800 (PST) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: alias template and typename [PR103057] Date: Tue, 25 Jan 2022 23:22:41 -0500 Message-Id: <20220126042241.934582-1-jason@redhat.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.1 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_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Usually we handle DR1558 substitution near the top of tsubst, but in this case while substituting TYPENAME_TYPE we were passing an alias specialization to tsubst_aggr_type, which ignored its aliasness. Tested x86_64-pc-linux-gnu, applying to trunk. PR c++/103057 gcc/cp/ChangeLog: * pt.cc (tsubst_aggr_type): Call tsubst for alias template specialization. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-void1.C: New test. --- gcc/cp/pt.cc | 8 ++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-void1.C | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-void1.C base-commit: fe5cee6f62a0b229d9d51616b7490331d39b5ddd prerequisite-patch-id: c7ab4056fcbd782232c8dc091597602ecd4a7a48 diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 8f50b9c4d3c..6fbda676527 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -13585,6 +13585,14 @@ tsubst_aggr_type (tree t, if (t == NULL_TREE) return NULL_TREE; + /* If T is an alias template specialization, we want to substitute that + rather than strip it, especially if it's dependent_alias_template_spec_p. + It should be OK not to handle entering_scope in this case, since + DECL_CONTEXT will never be an alias template specialization. We only get + here with an alias when tsubst calls us for TYPENAME_TYPE. */ + if (alias_template_specialization_p (t, nt_transparent)) + return tsubst (t, args, complain, in_decl); + switch (TREE_CODE (t)) { case RECORD_TYPE: diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-void1.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-void1.C new file mode 100644 index 00000000000..accc1a45abc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-void1.C @@ -0,0 +1,18 @@ +// PR c++/103057 +// { dg-do compile { target c++11 } } + +template struct A { }; +template struct B { using type = A; }; +template struct C { + using type = typename T::foo; // { dg-error "int" } +}; +template using L = B; + +template +typename L::type>::type +f(T) { }; + +int main() +{ + f(42); // { dg-error "no match" } +}