Can you also ask gcc bugzilla for gcc-11 backport ? so we get it into 11.4 On Wed, May 25, 2022 at 11:49 AM Martin Jansa <martin.ja...@gmail.com> wrote: > > * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96204 > * with gcc-11 I'm seeing some components failing with: > > lib32-recipe-sysroot/usr/include/gtest/gtest-printers.h:290:36: error: no > matching function for call to > 'testing::internal::internal_stream_operator_without_lexical_name_lookup::StreamPrinter::PrintValue(const > bluetooth::Uuid&, std::nullptr_t)' > 290 | T, decltype(Printer::PrintValue(std::declval<const T&>(), > nullptr)), > | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > ... > lib32-recipe-sysroot/usr/include/gtest/gtest-printers.h:212:33: error: no > match for 'operator<<' (operand types are 'std::basic_ostream<char>' and > 'const bluetooth::Uuid') > 211 | typename = decltype(std::declval<std::ostream&>() > | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > 212 | << std::declval<const T&>())> > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ > ... > lib32-recipe-sysroot/usr/include/c++/12.0.0/ostream:747:5: error: no type > named 'type' in 'struct std::enable_if<false, void>' > > which built fine with gcc-10 and builds fine again with gcc-12, > this backported patch fixes it for gcc-11 as well > > Signed-off-by: Martin Jansa <martin.ja...@gmail.com> > --- > meta/recipes-devtools/gcc/gcc-11.3.inc | 1 + > ...during-partial-spec-matching-PR96204.patch | 126 ++++++++++++++++++ > 2 files changed, 127 insertions(+) > create mode 100644 > meta/recipes-devtools/gcc/gcc/0030-c-access-scope-during-partial-spec-matching-PR96204.patch > > diff --git a/meta/recipes-devtools/gcc/gcc-11.3.inc > b/meta/recipes-devtools/gcc/gcc-11.3.inc > index b1ef9d25af..ac2bafde7a 100644 > --- a/meta/recipes-devtools/gcc/gcc-11.3.inc > +++ b/meta/recipes-devtools/gcc/gcc-11.3.inc > @@ -59,6 +59,7 @@ SRC_URI = "\ > file://0027-libatomic-Do-not-enforce-march-on-aarch64.patch \ > > file://0028-debug-101473-apply-debug-prefix-maps-before-checksum.patch \ > file://0029-Fix-install-path-of-linux64.h.patch \ > + > file://0030-c-access-scope-during-partial-spec-matching-PR96204.patch \ > \ > file://0001-CVE-2021-42574.patch \ > file://0002-CVE-2021-42574.patch \ > diff --git > a/meta/recipes-devtools/gcc/gcc/0030-c-access-scope-during-partial-spec-matching-PR96204.patch > > b/meta/recipes-devtools/gcc/gcc/0030-c-access-scope-during-partial-spec-matching-PR96204.patch > new file mode 100644 > index 0000000000..9d80c875f0 > --- /dev/null > +++ > b/meta/recipes-devtools/gcc/gcc/0030-c-access-scope-during-partial-spec-matching-PR96204.patch > @@ -0,0 +1,126 @@ > +From 9f26e34a5a9614a5b66f146752ecef9ea67b3e2d Mon Sep 17 00:00:00 2001 > +From: Patrick Palka <ppa...@redhat.com> > +Date: Sat, 26 Jun 2021 11:05:54 -0400 > +Subject: [PATCH] c++: access scope during partial spec matching [PR96204] > + > +Here, when determining whether the partial specialization matches > +has_type_member<Child>, we do so from the scope of where the template-id > +appears rather than from the scope of the specialization, and this > +causes us to select the partial specialization (since Child::type is > +accessible from Parent). When we later instantiate this partial > +specialization, we've entered the scope of the specialization and so > +substitution into e.g. the DECL_CONTEXT of has_type_member::value fails > +with access errors since the friend declaration that we relied on to > +choose the partial specialization no longer applies. > + > +It seems the appropriate access scope from which to perform partial > +specialization matching is the specialization itself (similar to how > +we check access of base-clauses), which is what this patch implements. > + > + PR c++/96204 > + > +gcc/cp/ChangeLog: > + > + * pt.c (instantiate_class_template_1): Enter the scope of the > + type when calling most_specialized_partial_spec. > + > +gcc/testsuite/ChangeLog: > + > + * g++.dg/template/access40.C: New test. > + * g++.dg/template/access40a.C: New test. > + > +Upstream-Status: Backport [12.1 > https://github.com/gcc-mirror/gcc/commit/9f26e34a5a9614a5b66f146752ecef9ea67b3e2d] > + > +--- > + gcc/cp/pt.c | 5 +++- > + gcc/testsuite/g++.dg/template/access40.C | 28 +++++++++++++++++++++++ > + gcc/testsuite/g++.dg/template/access40a.C | 28 +++++++++++++++++++++++ > + 3 files changed, 60 insertions(+), 1 deletion(-) > + create mode 100644 gcc/testsuite/g++.dg/template/access40.C > + create mode 100644 gcc/testsuite/g++.dg/template/access40a.C > + > +diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c > +index e5a2a2cd525..f2039e09cd7 100644 > +--- a/gcc/cp/pt.c > ++++ b/gcc/cp/pt.c > +@@ -11769,8 +11769,11 @@ instantiate_class_template_1 (tree type) > + deferring_access_check_sentinel acs (dk_no_deferred); > + > + /* Determine what specialization of the original template to > +- instantiate. */ > ++ instantiate; do this relative to the scope of the class for > ++ sake of access checking. */ > ++ push_nested_class (type); > + t = most_specialized_partial_spec (type, tf_warning_or_error); > ++ pop_nested_class (); > + if (t == error_mark_node) > + return error_mark_node; > + else if (t) > +diff --git a/gcc/testsuite/g++.dg/template/access40.C > b/gcc/testsuite/g++.dg/template/access40.C > +new file mode 100644 > +index 00000000000..d035e99e462 > +--- /dev/null > ++++ b/gcc/testsuite/g++.dg/template/access40.C > +@@ -0,0 +1,28 @@ > ++// PR c++/96204 > ++ > ++template<class, class = void> > ++struct has_type_member { > ++ static const bool value = false; > ++}; > ++ > ++template<class T> > ++struct has_type_member<T, typename T::type> { > ++ static const bool value = true; > ++}; > ++ > ++struct Parent; > ++ > ++struct Child { > ++private: > ++ friend struct Parent; > ++ typedef void type; > ++}; > ++ > ++struct Parent { > ++ static void f() { > ++ // The partial specialization does not match despite Child::type > ++ // being accessible from the current scope. > ++ extern int x[1]; > ++ extern int x[!has_type_member<Child>::value]; > ++ } > ++}; > +diff --git a/gcc/testsuite/g++.dg/template/access40a.C > b/gcc/testsuite/g++.dg/template/access40a.C > +new file mode 100644 > +index 00000000000..94025c513b7 > +--- /dev/null > ++++ b/gcc/testsuite/g++.dg/template/access40a.C > +@@ -0,0 +1,28 @@ > ++// PR c++/96204 > ++ > ++template<class, class = void> > ++struct has_type_member { > ++ static const bool value = false; > ++}; > ++ > ++template<class T> > ++struct has_type_member<T, typename T::type> { > ++ static const bool value = true; > ++}; > ++ > ++struct Parent; > ++ > ++struct Child { > ++private: > ++ friend struct has_type_member<Child>; > ++ typedef void type; > ++}; > ++ > ++struct Parent { > ++ static void f() { > ++ // The partial specialization matches because has_type_member<Child> > ++ // is a friend of Child. > ++ extern int x[1]; > ++ extern int x[has_type_member<Child>::value]; > ++ } > ++}; > -- > 2.35.1 > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#166168): https://lists.openembedded.org/g/openembedded-core/message/166168 Mute This Topic: https://lists.openembedded.org/mt/91339758/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-