1  int foo (int, int, int *);
       2  int bar (int, int, int *);
       3  #pragma omp declare variant (foo) \
       4    match (construct={parallel,for},\
       5  	 device={isa(avx512f,avx512vl),kind(host,cpu)},\
       6  	 implementation={vendor(score(0):gnu),unified_shared_memory},\
       7  	 user={condition(score(0):0)})
       8  #pragma omp declare variant (bar) \
       9    match (device={arch(x86_64,powerpc64),isa(avx512f,popcntb)}, \
      10  	 implementation={atomic_default_mem_order(seq_cst),made_up_selector("foo", 13, "bar")}, \
      11  	 user={condition(3-3)})
      12  int baz (int, int, int *);
      13  
      14  int
      15  qux (void)
      16  {
      17    int i = 3;
      18    return baz (1, 2, &i);
      19  }
      20  
      21  int quux (int);
      22  
      23  void
      24  corge (void)
      25  {
      26    int i;
      27    #pragma omp declare variant (quux) match (construct={parallel,for})
      28    extern int waldo (int);
      29    waldo (5);
      30    #pragma omp parallel for
      31    for (i = 0; i < 3; i++)
      32      waldo (6);
      33    #pragma omp parallel
      34    #pragma omp taskgroup
      35    #pragma omp for
      36    for (i = 0; i < 3; i++)
      37      waldo (7);
      38    #pragma omp parallel
      39    #pragma omp master    
      40    waldo (8);
      41  }
      42  
      43  #pragma omp declare variant (bar) match \
      44    (implementation={atomic_default_mem_order(relaxed), \
      45  		   unified_address, unified_shared_memory, \
      46  		   dynamic_allocators, reverse_offload})
      47  int baz2 (int x, int y, int *z)
      48  {
      49    return x + y + *z;
      50  }
      51  
      52  #pragma omp declare variant (bar) match \
      53    (implementation={atomic_default_mem_order(score(3): acq_rel)})
      54  int baz3 (int, int, int *);