From a87666533dd1778b8a0deae6369384024ad78115 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Tue, 3 Oct 2023 10:54:25 -0400 Subject: [PATCH] 11.4.1-2.3 Fix member vs global template Resolves: RHEL-2607 --- gcc.spec | 7 ++- gcc11-pr106310.patch | 108 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 gcc11-pr106310.patch diff --git a/gcc.spec b/gcc.spec index 086be7f..c0b1056 100644 --- a/gcc.spec +++ b/gcc.spec @@ -128,7 +128,7 @@ Summary: Various compilers (C, C++, Objective-C, ...) Name: gcc Version: %{gcc_version} -Release: %{gcc_release}.2%{?dist} +Release: %{gcc_release}.3%{?dist} # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -295,6 +295,7 @@ Patch31: gcc11-pr96024.patch Patch32: gcc11-testsuite-fixes-2.patch Patch33: gcc11-pr111039.patch Patch34: gcc11-pr111070.patch +Patch35: gcc11-pr106310.patch Patch100: gcc11-fortran-fdec-duplicates.patch Patch101: gcc11-fortran-flogical-as-integer.patch @@ -895,6 +896,7 @@ mark them as cross compiled. %patch32 -p1 -b .testsuite2~ %patch33 -p1 -b .pr111039~ %patch34 -p1 -b .pr111070~ +%patch35 -p1 -b .pr106310~ %if 0%{?rhel} >= 9 %patch100 -p1 -b .fortran-fdec-duplicates~ @@ -3588,6 +3590,9 @@ end %endif %changelog +* Tue Oct 3 2023 Marek Polacek 11.4.1-2.3 +- fix member vs global template (RHEL-2607) + * Mon Oct 2 2023 Marek Polacek 11.4.1-2.2 - guard the bit test merging code in if-combine (RHEL-6068) diff --git a/gcc11-pr106310.patch b/gcc11-pr106310.patch new file mode 100644 index 0000000..98ee967 --- /dev/null +++ b/gcc11-pr106310.patch @@ -0,0 +1,108 @@ +commit 506d5f399bef7f2d8c48fd83d853c6ff7811a226 +Author: Jason Merrill +Date: Wed Jul 26 10:39:34 2023 -0400 + + c++: member vs global template [PR106310] + + For backward compatibility we still want to allow patterns like + this->A::foo, but the template keyword in a qualified name is + specifically to specify that a dependent name is a template, so don't look + in the enclosing scope at all. + + Also fix handling of dependent bases: if member lookup in the current + instantiation fails and we have dependent bases, the lookup is dependent. + We were already handling that for the case where lookup in the enclosing + scope also fails, but we also want it to affect that lookup itself. + + PR c++/106310 + + gcc/cp/ChangeLog: + + * parser.c (cp_parser_template_name): Skip non-member + lookup after the template keyword. + (cp_parser_lookup_name): Pass down template_keyword_p. + + gcc/testsuite/ChangeLog: + + * g++.dg/template/template-keyword4.C: New test. + +diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c +index 8287934a679..8df715596eb 100644 +--- a/gcc/cp/parser.c ++++ b/gcc/cp/parser.c +@@ -2610,7 +2610,7 @@ static tree cp_parser_objc_struct_declaration + /* Utility Routines */ + + static cp_expr cp_parser_lookup_name +- (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *, location_t); ++ (cp_parser *, tree, enum tag_types, int, bool, bool, tree *, location_t); + static tree cp_parser_lookup_name_simple + (cp_parser *, tree, location_t); + static tree cp_parser_maybe_treat_template_as_class +@@ -17748,7 +17748,7 @@ cp_parser_template_name (cp_parser* parser, + /* Look up the name. */ + decl = cp_parser_lookup_name (parser, identifier, + tag_type, +- /*is_template=*/true, ++ /*is_template=*/1 + template_keyword_p, + /*is_namespace=*/false, + check_dependency_p, + /*ambiguous_decls=*/NULL, +@@ -29254,7 +29254,7 @@ prefer_type_arg (tag_types tag_type) + refer to types are ignored. + + If IS_TEMPLATE is TRUE, bindings that do not refer to templates are +- ignored. ++ ignored. If IS_TEMPLATE IS 2, the 'template' keyword was specified. + + If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces + are ignored. +@@ -29269,7 +29269,7 @@ prefer_type_arg (tag_types tag_type) + static cp_expr + cp_parser_lookup_name (cp_parser *parser, tree name, + enum tag_types tag_type, +- bool is_template, ++ int is_template, + bool is_namespace, + bool check_dependency, + tree *ambiguous_decls, +@@ -29454,7 +29454,14 @@ cp_parser_lookup_name (cp_parser *parser, tree name, + else + decl = NULL_TREE; + +- if (!decl) ++ /* If we didn't find a member and have dependent bases, the member lookup ++ is now dependent. */ ++ if (!dep && !decl && any_dependent_bases_p (object_type)) ++ dep = true; ++ ++ if (dep && is_template == 2) ++ /* The template keyword specifies a dependent template. */; ++ else if (!decl) + /* Look it up in the enclosing context. DR 141: When looking for a + template-name after -> or ., only consider class templates. */ + decl = lookup_name (name, is_namespace ? LOOK_want::NAMESPACE +diff --git a/gcc/testsuite/g++.dg/template/template-keyword4.C b/gcc/testsuite/g++.dg/template/template-keyword4.C +new file mode 100644 +index 00000000000..a7ab9bb8ca6 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/template/template-keyword4.C +@@ -0,0 +1,18 @@ ++// PR c++/106310 ++ ++template ++struct set{}; ++ ++template< typename T > ++struct Base ++{ ++ template< int > int set(T const &); ++}; ++ ++template< typename T > ++struct Derived : Base< T > ++{ ++ void f(T const &arg) { ++ this->template set< 0 >(arg); ++ } ++};