]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP/C++: Fix declare variant with reference-returning functions
authorTobias Burnus <tburnus@baylibre.com>
Thu, 31 Oct 2024 10:28:57 +0000 (11:28 +0100)
committerTobias Burnus <tburnus@baylibre.com>
Thu, 31 Oct 2024 10:36:04 +0000 (11:36 +0100)
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.

gcc/cp/decl.cc
gcc/testsuite/g++.dg/gomp/declare-variant-9.C [new file with mode: 0644]

index 0bc320a2b39658fd9e432c1d0e218fb79bcdcb9f..b638f3af294d9f94fbe6069b36ce899b93aa1f6e 100644 (file)
@@ -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 (file)
index 0000000..7e26d8b
--- /dev/null
@@ -0,0 +1,29 @@
+/* { 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(); 
+}
+
+template<typename T>
+T &templ_var_fn(T x);
+
+#pragma omp declare variant(templ_var_fn) match(user={condition(1)})
+template<typename T>
+T &templ_base_fn(T x);
+
+void run(int &b)
+{
+  templ_base_fn<int>(5);
+  b = templ_base_fn<int>(7); 
+}
+
+/* { dg-final { scan-tree-dump "  variant_fn \\(\\);" "gimple" } } */
+/* { dg-final { scan-tree-dump "  _1 = variant_fn \\(\\);" "gimple" } } */
+/* { dg-final { scan-tree-dump "  templ_var_fn<int> \\(5\\);" "gimple" } } */
+/* { dg-final { scan-tree-dump "  _1 = templ_var_fn<int> \\(7\\);" "gimple" } } */