xref: /llvm-project/clang/test/Sema/attr-target-version.c (revision 73db9ee1e87b4cfccbc9d67d2b47d9476f92413f)
1 // RUN: %clang_cc1 -triple aarch64-linux-gnu  -fsyntax-only -verify %s
2 
3 int __attribute__((target_version("crc"))) dup(void) { return 3; }
4 int __attribute__((target_version("default"))) dup(void) { return 1; }
5 //expected-error@+2 {{redefinition of 'dup'}}
6 //expected-note@-2 {{previous definition is here}}
7 int __attribute__((target_version("default"))) dup(void) { return 2; }
8 
9 int __attribute__((target_version("default"))) dup1(void) { return 1; }
10 //expected-error@+2 {{redefinition of 'dup1'}}
11 //expected-note@-2 {{previous definition is here}}
12 int dup1(void) { return 2; }
13 
14 int __attribute__((target_version("aes"))) foo(void) { return 1; }
15 //expected-note@+1 {{previous definition is here}}
16 int __attribute__((target_version("default"))) foo(void) { return 2; }
17 
18 //expected-note@+1 {{previous definition is here}}
19 int __attribute__((target_version("sha3 + aes "))) foo(void) { return 1; }
20 //expected-note@-1 {{previous definition is here}}
21 
22 //expected-error@+1 {{redefinition of 'foo'}}
23 int __attribute__((target("dotprod"))) foo(void) { return -1; }
24 //expected-warning@-1 {{attribute declaration must precede definition}}
25 
26 //expected-error@+1 {{redefinition of 'foo'}}
27 int foo(void) { return 2; }
28 
29 //expected-note@+1 {{previous definition is here}}
30 __attribute__ ((target("bf16,sve,sve2,dotprod"))) int func(void) { return 1; }
31 //expected-error@+1 {{redefinition of 'func'}}
32 __attribute__ ((target("default"))) int func(void) { return 0; }
33 
34 //expected-note@+1 {{previous declaration is here}}
35 void __attribute__((target_version("bti+flagm2"))) one(void) {}
36 //expected-error@+1 {{multiversioned function redeclarations require identical target attributes}}
37 void __attribute__((target_version("flagm2+bti"))) one(void) {}
38 
39 void __attribute__((target_version("ssbs+sha2"))) two(void) {}
40 void __attribute__((target_version("ssbs+fp16fml"))) two(void) {}
41 
42 //expected-error@+1 {{'main' cannot be a multiversioned function}}
43 int __attribute__((target_version("lse"))) main(void) { return 1; }
44 
45 // It is ok for the default version to appear first.
46 int default_first(void) { return 1; }
47 int __attribute__((target_version("dit"))) default_first(void) { return 2; }
48 int __attribute__((target_version("mops"))) default_first(void) { return 3; }
49 
50 // It is ok if the default version is between other versions.
51 int __attribute__((target_version("simd"))) default_middle(void) {return 0; }
52 int __attribute__((target_version("default"))) default_middle(void) { return 1; }
53 int __attribute__((target_version("aes"))) default_middle(void) { return 2; }
54 
55 // It is ok for the default version to be the last one.
56 int __attribute__((target_version("rdm"))) default_last(void) {return 0; }
57 int __attribute__((target_version("lse+aes"))) default_last(void) { return 1; }
58 int __attribute__((target_version("default"))) default_last(void) { return 2; }
59 
60 // It is also ok to forward declare the default.
61 int __attribute__((target_version("default"))) default_fwd_declare(void);
62 int __attribute__((target_version("sve"))) default_fwd_declare(void) { return 0; }
63 int default_fwd_declare(void) { return 1; }
64 
65 //expected-warning@+1 {{unsupported '' in the 'target_version' attribute string; 'target_version' attribute ignored}}
66 int __attribute__((target_version(""))) unsup1(void) { return 1; }
67 //expected-warning@+1 {{unsupported 'crc32' in the 'target_version' attribute string; 'target_version' attribute ignored}}
68 void __attribute__((target_version("crc32"))) unsup2(void) {}
69 
70 void __attribute__((target_version("default+fp16"))) koo(void) {}
71 //expected-error@-1 {{function multiversioning doesn't support feature 'default'}}
72 void __attribute__((target_version("default+default+default"))) loo(void) {}
73 //expected-error@-1 {{function multiversioning doesn't support feature 'default'}}
74 void __attribute__((target_version("rdm+rng+crc"))) redef(void) {}
75 //expected-error@+2 {{redefinition of 'redef'}}
76 //expected-note@-2 {{previous definition is here}}
77 void __attribute__((target_version("rdm+rng+crc"))) redef(void) {}
78 
79 int def(void);
80 void __attribute__((target_version("dit"))) nodef(void);
81 void __attribute__((target_version("wfxt"))) nodef(void);
82 void __attribute__((target_version("aes"))) ovl(void);
83 void __attribute__((target_version("default"))) ovl(void);
84 int bar() {
85   // expected-error@+2 {{reference to overloaded function could not be resolved; did you mean to call it?}}
86   // expected-note@-3 {{possible target for call}}
87   ovl++;
88   nodef();
89   return def();
90 }
91 // expected-error@+2 {{function declaration cannot become a multiversioned function after first usage}}
92 // expected-note@-13 {{previous declaration is here}}
93 int __attribute__((target_version("sha2"))) def(void) { return 1; }
94 
95 int __attribute__((target_version("sve"))) prot();
96 // expected-error@-1 {{multiversioned function must have a prototype}}
97 
98 int __attribute__((target_version("aes"))) rtype(int);
99 // expected-error@+1 {{multiversioned function declaration has a different return type}}
100 float __attribute__((target_version("rdm"))) rtype(int);
101 
102 int __attribute__((target_version("sha2"))) combine(void) { return 1; }
103 // expected-error@+1 {{multiversioned function declaration has a different calling convention}}
104 int __attribute__((aarch64_vector_pcs, target_version("sha3"))) combine(void) { return 2; }
105 
106 // expected-error@+1 {{multiversioned function must have a prototype}}
107 int __attribute__((target_version("fp+aes+rcpc"))) unspec_args() { return -1; }
108 // expected-error@-1 {{multiversioned function must have a prototype}}
109 // expected-note@+1 {{function multiversioning caused by this declaration}}
110 int __attribute__((target_version("default"))) unspec_args() { return 0; }
111 int cargs() { return unspec_args(); }
112 
113 // expected-error@+1 {{multiversioned function must have a prototype}}
114 int unspec_args_implicit_default_first();
115 // expected-error@-1 {{multiversioned function must have a prototype}}
116 // expected-note@+1 {{function multiversioning caused by this declaration}}
117 int __attribute__((target_version("aes"))) unspec_args_implicit_default_first() { return -1; }
118 // expected-note@+1 {{function multiversioning caused by this declaration}}
119 int __attribute__((target_version("default"))) unspec_args_implicit_default_first() { return 0; }
120