@@ -1092,6 +1092,8 @@ c_omp_declare_simd_clauses_to_numbers (t
for (i = 0; i < len; i++)
OMP_CLAUSE_CHAIN (clvec[i]) = (i < len - 1) ? clvec[i + 1] : NULL_TREE;
}
+ else
+ clauses = NULL_TREE;
clvec.release ();
return clauses;
}
@@ -7905,7 +7905,7 @@ grokfndecl (tree ctype,
if (TYPE_NOTHROW_P (type) || nothrow_libfn_p (decl))
TREE_NOTHROW (decl) = 1;
- if (flag_openmp || flag_cilkplus)
+ if (flag_openmp || flag_openmp_simd || flag_cilkplus)
{
/* Adjust "omp declare simd" attributes. */
tree ods = lookup_attribute ("omp declare simd", *attrlist);
@@ -9065,7 +9065,7 @@ apply_late_template_attributes (tree *de
{
*p = TREE_CHAIN (t);
TREE_CHAIN (t) = NULL_TREE;
- if ((flag_openmp || flag_cilkplus)
+ if ((flag_openmp || flag_openmp_simd || flag_cilkplus)
&& is_attribute_p ("omp declare simd",
get_attribute_name (t))
&& TREE_VALUE (t))
@@ -58,7 +58,7 @@ lappend VECT_SLP_CFLAGS "-fdump-tree-slp
dg-init
# Main loop.
-g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.{c,cc,S} ]] \
+g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/{pr,simd}*.{c,cc,S} ]] \
"" $DEFAULT_VECTCFLAGS
g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/slp-pr*.{c,cc,S} ]] \
"" $VECT_SLP_CFLAGS
@@ -5,8 +5,14 @@
# include "cpuid.h"
#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
extern void abort (void);
extern void exit (int);
+#ifdef __cplusplus
+}
+#endif
static void
sig_ill_handler (int sig)
@@ -26,7 +32,7 @@ check_vect (void)
asm volatile (".long 0x10000484");
#elif defined(__i386__) || defined(__x86_64__)
{
- int a, b, c, d, want_level, want_c, want_d;
+ unsigned int a, b, c, d, want_level, want_c, want_d;
/* Determine what instruction set we've been compiled for, and detect
that we're running with it. This allows us to at least do a compile
@@ -0,0 +1,55 @@
+// { dg-require-effective-target vect_simd_clones }
+// { dg-additional-options "-fopenmp-simd -fno-inline" }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+#include "../../gcc.dg/vect/tree-vect.h"
+
+struct S
+{
+ int s;
+ #pragma omp declare simd notinbranch linear(x)
+ int f (int x);
+};
+
+#pragma omp declare simd notinbranch linear(x)
+int
+S::f (int x)
+{
+ return x;
+}
+
+template <int N>
+struct T
+{
+ int t;
+ #pragma omp declare simd notinbranch linear(x)
+ int f (int x);
+};
+
+#pragma omp declare simd notinbranch linear(x)
+template <int N>
+int
+T<N>::f (int x)
+{
+ return x;
+}
+
+void
+do_main ()
+{
+ int i, r = 0;
+ S s;
+ T<0> t;
+ #pragma omp simd reduction(+:r)
+ for (i = 0; i < 64; i++)
+ r += s.f (i) + t.f (i);
+ if (r != 64 * 63)
+ abort ();
+}
+
+int
+main ()
+{
+ check_vect ();
+ do_main ();
+}