From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 3CD743858D1E for ; Wed, 4 Jan 2023 09:32:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3CD743858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1672824751; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=F8VDCd+wnYgWpTbuvCkw3MxJ1HEQuQjG/rUhACPfBQs=; b=jFFtmIkGHmsi0rVi5VnXvW1cgPlRZhTvZj1/sfkstq1JH72EvlI9l2uI0QZR/3QrOGDtOT uOu938diItmszReHZUOKsHuHJBhsYStUnujMkmethijp5A+963qj2waaJ2ZIhJ2Mo0/e1y Z7ex8QuZes5FVZIxe+B9uuc1mLxpW4A= 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-119-5N0Y0RcxNju3XEYw_mgX3Q-1; Wed, 04 Jan 2023 04:32:30 -0500 X-MC-Unique: 5N0Y0RcxNju3XEYw_mgX3Q-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 F343D3803908 for ; Wed, 4 Jan 2023 09:32:29 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.223]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B0AD8140EBF5; Wed, 4 Jan 2023 09:32:29 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 3049WR6I2398003 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 4 Jan 2023 10:32:27 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 3049WQfX2398002; Wed, 4 Jan 2023 10:32:26 +0100 Date: Wed, 4 Jan 2023 10:32:26 +0100 From: Jakub Jelinek To: Jason Merrill Cc: gcc-patches@gcc.gnu.org, Patrick Palka Subject: [PATCH] c++: Error recovery in merge_default_template_args [PR108206] Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,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 List-Id: Hi! We ICE on the following testcase during error recovery, both new_parm and old_parm are error_mark_node, the ICE is on error ("redefinition of default argument for %q+#D", new_parm); inform (DECL_SOURCE_LOCATION (old_parm), "original definition appeared here"); where we don't print anything useful for new_parm and ICE trying to access DECL_SOURCE_LOCATION of old_parm. I think we shouldn't diagnose anything when either of the parms is erroneous, GCC 11 before merge_default_template_args has been added was doing if (TREE_VEC_ELT (tmpl_parms, i) == error_mark_node || TREE_VEC_ELT (parms, i) == error_mark_node) continue; tmpl_parm = TREE_VALUE (TREE_VEC_ELT (tmpl_parms, i)); if (error_operand_p (tmpl_parm)) return false; in redeclare_class_template. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2023-01-04 Jakub Jelinek PR c++/108206 * decl.cc (merge_default_template_args): Return false if either new_parm or old_parm are erroneous. * g++.dg/template/pr108206.C: New test. --- gcc/cp/decl.cc.jj 2022-12-22 11:09:52.026181629 +0100 +++ gcc/cp/decl.cc 2023-01-03 18:11:25.202223528 +0100 @@ -1556,6 +1556,8 @@ merge_default_template_args (tree new_pa tree old_parm = TREE_VALUE (TREE_VEC_ELT (old_parms, i)); tree& new_default = TREE_PURPOSE (TREE_VEC_ELT (new_parms, i)); tree& old_default = TREE_PURPOSE (TREE_VEC_ELT (old_parms, i)); + if (error_operand_p (new_parm) || error_operand_p (old_parm)) + return false; if (new_default != NULL_TREE && old_default != NULL_TREE) { auto_diagnostic_group d; --- gcc/testsuite/g++.dg/template/pr108206.C.jj 2023-01-03 18:14:18.768730450 +0100 +++ gcc/testsuite/g++.dg/template/pr108206.C 2023-01-03 18:13:40.427281176 +0100 @@ -0,0 +1,5 @@ +// PR c++/108206 +// { dg-do compile { target c++11 } } + +template void foo (T1); // { dg-error "'X' has not been declared" } +template void foo (T2); // { dg-error "'X' has not been declared" } Jakub