* 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 (#166166): 
https://lists.openembedded.org/g/openembedded-core/message/166166
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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to