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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to