* 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 <[email protected]>
---
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 <[email protected]>
+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 (#166166):
https://lists.openembedded.org/g/openembedded-core/message/166166
Mute This Topic: https://lists.openembedded.org/mt/91339758/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-