diff mbox series

OpenMP/C++: Fix declare variant with reference-returning functions

Message ID 10446a42-bab7-4325-966c-f0dcabfb8658@baylibre.com
State New
Headers show
Series OpenMP/C++: Fix declare variant with reference-returning functions | expand

Commit Message

Tobias Burnus Oct. 30, 2024, 5:46 p.m. UTC
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?

Tobias
diff mbox series

Patch

OpenMP/C++: Fix declare variant with reference-returning functions

gcc/cp/ChangeLog:

	* decl.cc (omp_declare_variant_finalize_one): Strip indirect ref
	around function decl when processing variant function.

gcc/testsuite/ChangeLog:

	* g++.dg/gomp/declare-variant-9.C: New test.

 gcc/cp/decl.cc                                |  3 +++
 gcc/testsuite/g++.dg/gomp/declare-variant-9.C | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

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);
   input_location = save_loc;
 
diff --git a/gcc/testsuite/g++.dg/gomp/declare-variant-9.C b/gcc/testsuite/g++.dg/gomp/declare-variant-9.C
new file mode 100644
index 00000000000..7856f7c40cf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/declare-variant-9.C
@@ -0,0 +1,14 @@ 
+/* { dg-additional-options "-fdump-tree-gimple" } */
+int &variant_fn();
+
+#pragma omp declare variant(variant_fn) match(user={condition(1)})
+int &bar();
+
+void sub(int &a)
+{
+     bar();
+     a = bar(); 
+}
+
+/* { dg-final { scan-tree-dump "  variant_fn \\(\\);" "gimple" } } */
+/* { dg-final { scan-tree-dump "  _1 = variant_fn \\(\\);" "gimple" } } */