From patchwork Fri Apr 29 03:00:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 53330 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 0DEA3385842B for ; Fri, 29 Apr 2022 03:01:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0DEA3385842B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1651201274; bh=5qNd2fg51glPLAVABnYgsLSjhB+HBw61FZlH/YNvHG8=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=JwhrtH+DWIVgQ5ngMTCexpdPrM1irlnW2SZLW8gBQvrK6zrsskDEjvBO0TVShfkyr IZofWejw+zEGwOqv5tpSSdYIremG9+vReyGH+HouOQMC1fhzjlNT0Jnsj5d7P8B+oS QWMFoRhClherZjiJ4pxv5cQgyLkxvlKzRllkb/r0= 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 010A03858D28 for ; Fri, 29 Apr 2022 03:00:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 010A03858D28 Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-538-18gaRCfNNg23GtZuSN2jmw-1; Thu, 28 Apr 2022 23:00:42 -0400 X-MC-Unique: 18gaRCfNNg23GtZuSN2jmw-1 Received: by mail-qk1-f198.google.com with SMTP id u129-20020a372e87000000b0069f8a79378eso4484886qkh.5 for ; Thu, 28 Apr 2022 20:00:42 -0700 (PDT) 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=5qNd2fg51glPLAVABnYgsLSjhB+HBw61FZlH/YNvHG8=; b=B0JoXS7Ggrb22zHEvFPZ1r4uewW+ipr9XojdfDsgbtrmqbnTiZV3F3OR8BLWO9KKkK H++cjZGwO8IslBON514+uQBtVH3kzpZelP6HZUp17IjLpdIW6Gbva2zvDy0Un9gdTrds ur5VaqOig8+uP/gAX1ZA/qfqRuCXyGWTxqyTJTnRPkM7W42U0b7scHssCtpD4dN68Uff uzLynKNaM/2zHkY7P4m+u5cJPNiOW4taq68S6gJRjU3b8Nj5N8TC6blOxYfAE6gYriTl OlVIaCnBKThYat5uQJzBgUUJMzg8nZj0+UaecUd2OXl92TOmASRZ/PPjiyv04rm4J0jp Oxbw== X-Gm-Message-State: AOAM533oOVslJQRa9RlGKgNe1nhF2FHh1q01rWiCqaezrnbtcZCAyTWJ e5ItUq+pQ4H41Ex28yHwM/HXgSyRpCpquGcB9lOt4zkpUjGd/TtjNQNDW19wMtXXcwUB2CH9lUl VpJyf5P2YpsjOzV7z+IIozBQTcPDu3xfG32FboF/vkgy/wzzjElr+yb68+uLZeWINZw== X-Received: by 2002:a05:620a:1aa1:b0:69e:ca6b:9df5 with SMTP id bl33-20020a05620a1aa100b0069eca6b9df5mr21044453qkb.482.1651201241332; Thu, 28 Apr 2022 20:00:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxpQDvFpMRssqZnAcxwq16cMS1Bb0nUBZQ+k8vneM+G8hRGXfkS4Rlqc8vHbA1MwlTL42Qdfw== X-Received: by 2002:a05:620a:1aa1:b0:69e:ca6b:9df5 with SMTP id bl33-20020a05620a1aa100b0069eca6b9df5mr21044443qkb.482.1651201240947; Thu, 28 Apr 2022 20:00:40 -0700 (PDT) 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 e16-20020ac85990000000b002f3772de70asm1084995qte.69.2022.04.28.20.00.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Apr 2022 20:00:40 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: typeid and instantiation [PR102651] Date: Thu, 28 Apr 2022 23:00:38 -0400 Message-Id: <20220429030038.1097605-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.4 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, 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" PR49387 was a problem with initially asking for a typeid for a class template specialization before it was complete, and later actually filling in the descriptor when the class was complete, and thus disagreeing on the form of the descriptor. I fixed that by forcing the class to be complete, but this testcase shows why that approach is problematic. So instead let's adjust the type of the descriptor later if needed. Tested x86_64-pc-linux-gnu, applying to trunk. PR c++/102651 PR c++/49387 gcc/cp/ChangeLog: * rtti.cc (get_tinfo_decl_direct): Don't complete_type. (emit_tinfo_decl): Update tdesc type if needed. gcc/testsuite/ChangeLog: * g++.dg/rtti/typeid-complete1.C: New test. --- gcc/cp/rtti.cc | 15 +++++++++++---- gcc/testsuite/g++.dg/rtti/typeid-complete1.C | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/rtti/typeid-complete1.C base-commit: 654f6978cdc85a3970ff2c478d4df3e55cf4d3ab diff --git a/gcc/cp/rtti.cc b/gcc/cp/rtti.cc index a4dedc31f0a..f5b43ec0fb2 100644 --- a/gcc/cp/rtti.cc +++ b/gcc/cp/rtti.cc @@ -446,9 +446,6 @@ get_tinfo_decl_direct (tree type, tree name, int pseudo_ix) gcc_checking_assert (TREE_CODE (type) != METHOD_TYPE); - if (pseudo_ix < 0) - type = complete_type (type); - if (CLASS_TYPE_P (type)) d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)); @@ -1693,7 +1690,17 @@ emit_tinfo_decl (tree decl) tree init; DECL_EXTERNAL (decl) = 0; - init = get_pseudo_ti_init (type, get_pseudo_ti_index (type)); + int pseudo_ix = get_pseudo_ti_index (type); + const tinfo_s *ti = get_tinfo_desc (pseudo_ix); + if (TREE_TYPE (decl) != ti->type) + { + /* If the class became complete since we first called get_tinfo_decl, + its type_info descriptor may have switched from __class_type_info + to e.g. __si_class_type_info. */ + TREE_TYPE (decl) = ti->type; + relayout_decl (decl); + } + init = get_pseudo_ti_init (type, pseudo_ix); DECL_INITIAL (decl) = init; mark_used (decl); cp_finish_decl (decl, init, false, NULL_TREE, 0); diff --git a/gcc/testsuite/g++.dg/rtti/typeid-complete1.C b/gcc/testsuite/g++.dg/rtti/typeid-complete1.C new file mode 100644 index 00000000000..8d3fec46801 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid-complete1.C @@ -0,0 +1,14 @@ +// PR c++/102651 + +#include + +template +struct S : T{ + T x; +}; + +const void *p; +int main() +{ + p = &typeid( S** ); +}