From 8ff8c3ac0dd675319d779a1aa0087e8a0d5a81b2 Mon Sep 17 00:00:00 2001 From: Tom Honermann Date: Tue, 15 Mar 2022 14:36:26 -0700 Subject: [PATCH] [clang] [OpenMP] Extend OpenMP variant declaration tests. This change extends the existing diagnostic tests for OpenMP variant declarations to cover diagnostics for declarations that include multiversion function attributes. The new tests demonstrate a missing check for the 'target_clones' attribute. Reviewed By: erichkeane, jdoerfert Differential Revision: https://reviews.llvm.org/D121962 --- clang/test/OpenMP/declare_variant_messages.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/clang/test/OpenMP/declare_variant_messages.c b/clang/test/OpenMP/declare_variant_messages.c index 5618e1b..e00d161 100644 --- a/clang/test/OpenMP/declare_variant_messages.c +++ b/clang/test/OpenMP/declare_variant_messages.c @@ -142,6 +142,30 @@ int diff_ret_variant(void); #pragma omp declare variant(diff_ret_variant) match(xxx={}) // expected-error {{variant in '#pragma omp declare variant' with type 'int (void)' is incompatible with type 'void (void)'}} expected-warning {{'xxx' is not a valid context set in a `declare variant`; set ignored}} expected-note {{context set options are: 'construct' 'device' 'implementation' 'user'}} expected-note {{the ignored set spans until here}} void diff_ret(void); +void incompat_attr_variant(void); + +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((cpu_dispatch(generic))) void incompat_attr_cpu_dispatch(void); // expected-error {{'#pragma omp declare variant' is not compatible with any target-specific attributes}} + +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((cpu_specific(generic))) void incompat_attr_cpu_specific(void); // expected-error {{'#pragma omp declare variant' is not compatible with any target-specific attributes}} + +// 'incompat_attr_target' is not a multiversion function until... +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((target("mmx"))) void incompat_attr_target(void); // expected-error {{'#pragma omp declare variant' is not compatible with any target-specific attributes}} + +// This declaration makes it one. +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((target("sse"))) void incompat_attr_target(void); // expected-error {{'#pragma omp declare variant' is not compatible with any target-specific attributes}} + +// 'incompat_attr_target_default' is always a multiversion function. +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((target("default"))) void incompat_attr_target_default(void); // expected-error {{'#pragma omp declare variant' is not compatible with any target-specific attributes}} + +// FIXME: No diagnostics are produced for use of the 'target_clones' attribute in an OMP variant declaration. +#pragma omp declare variant(incompat_attr_variant) match(implementation={vendor(llvm)}) +__attribute__((target_clones("sse,default"))) void incompat_attr_target_clones(void); + void marked(void); void not_marked(void); -- 2.7.4