On Thu, Oct 31, 2024 at 11:37:35AM +0100, Tobias Burnus wrote:
> Tobias Burnus wrote:
> > Before the patch, the included testcase fails with:
> > 
> > declare-variant-9.C:4:29: error: could not find variant declaration
> >      4 | #pragma omp declare variant(variant_fn) match(user={condition(1)})
> >        |                             ^~~~~~~~~~
> > 
> > Comments, remarks, suggestions before I commit it?
> 
> I realized that a template testcase was missing – hence, I extended
> the testcase; cf. attachment.
> 
> → Committed as r15-4799-gf011f8908182fd
> 
> BTW: Initially, the template testcase did not work; it turned out that I made
> a typo (tmpl vs templ) in the variant name, which GCC did/does not diagnose.
> 
> I discussed with Jakub, who will take care of adding a diagnostic. Thanks!
> 
> Tobias

> commit f011f8908182fd05ddd9a34881507b8584c44fb2
> Author: Tobias Burnus <tbur...@baylibre.com>
> Date:   Thu Oct 31 11:28:57 2024 +0100
> 
>     OpenMP/C++: Fix declare variant with reference-returning functions
>     
>     gcc/cp/ChangeLog:
>     
>             * decl.cc (omp_declare_variant_finalize_one): Strip indirect ref
>             around variant-function call when processing a variant.
>     
>     gcc/testsuite/ChangeLog:
>     
>             * g++.dg/gomp/declare-variant-9.C: New test.
> 
> diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
> index 0bc320a2b39..b638f3af294 100644
> --- a/gcc/cp/decl.cc
> +++ b/gcc/cp/decl.cc
> @@ -8375,6 +8375,9 @@ omp_declare_variant_finalize_one (tree decl, tree attr)
>    if (variant == error_mark_node && !processing_template_decl)
>      return true;
>  
> +  if (TREE_CODE (variant) == INDIRECT_REF)
> +    variant = TREE_OPERAND (variant, 0);
> +
>    variant = cp_get_callee_fndecl_nofold (variant);

I think this should be just
  variant = cp_get_callee_fndecl_nofold (STRIP_REFERENCE_REF (variant));
instead.

        Jakub

Reply via email to