From: Alfie Richards <[email protected]>
Adds some aarch64 C fmv diagnostic tests.
This mostly tests C front end code, but has to be target specific at FMV
is requires specifying target extensions.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/mv-and-mvc-error1.c: New test.
* gcc.target/aarch64/mv-and-mvc-error2.c: New test.
* gcc.target/aarch64/mv-and-mvc-error3.c: New test.
* gcc.target/aarch64/mv-error1.c: New test.
* gcc.target/aarch64/mv-error2.c: New test.
* gcc.target/aarch64/mv-error3.c: New test.
* gcc.target/aarch64/mv-error4.c: New test.
* gcc.target/aarch64/mv-error5.c: New test.
* gcc.target/aarch64/mv-error6.c: New test.
* gcc.target/aarch64/mv-error7.c: New test.
* gcc.target/aarch64/mv-error8.c: New test.
* gcc.target/aarch64/mv-error9.c: New test.
* gcc.target/aarch64/mv-error10.c: New test.
* gcc.target/aarch64/mvc-error1.c: New test.
* gcc.target/aarch64/mvc-error2.c: New test.
* gcc.target/aarch64/mvc-warning1.c: New test.
---
.../gcc.target/aarch64/mv-and-mvc-error1.c | 9 +++++++++
.../gcc.target/aarch64/mv-and-mvc-error2.c | 9 +++++++++
.../gcc.target/aarch64/mv-and-mvc-error3.c | 8 ++++++++
gcc/testsuite/gcc.target/aarch64/mv-error1.c | 18 +++++++++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error10.c | 13 ++++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error2.c | 9 +++++++++
gcc/testsuite/gcc.target/aarch64/mv-error3.c | 12 +++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error4.c | 9 +++++++++
gcc/testsuite/gcc.target/aarch64/mv-error5.c | 8 ++++++++
gcc/testsuite/gcc.target/aarch64/mv-error6.c | 20 +++++++++++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error7.c | 11 ++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error8.c | 12 +++++++++++
gcc/testsuite/gcc.target/aarch64/mv-error9.c | 12 +++++++++++
gcc/testsuite/gcc.target/aarch64/mvc-error1.c | 9 +++++++++
gcc/testsuite/gcc.target/aarch64/mvc-error2.c | 9 +++++++++
.../gcc.target/aarch64/mvc-warning1.c | 13 ++++++++++++
16 files changed, 181 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error10.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error3.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error4.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error5.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error6.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error7.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error8.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error9.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error1.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error2.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-warning1.c
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c
b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c
new file mode 100644
index 00000000000..b08de29dd3c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("dotprod"))) int
+foo () { return 3; } /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) int
+foo () { return 1; } /* { dg-error "redefinition of .foo
\\\[\\\[target_clones\\(.dotprod., .sve.\\)\\\]\\\]." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c
b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c
new file mode 100644
index 00000000000..d34b246efc5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("default"))) int
+foo () { return 1; } /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.default.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error "conflicting types for .foo
\\\[\\\[target_clones\\(.dotprod., .sve.\\)\\\]\\\].; have .float\\(void\\)." }
*/
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c
b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c
new file mode 100644
index 00000000000..a6a45bdf7aa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+float foo () { return 1; } /* { dg-message "previous definition of .foo." } */
+
+__attribute__ ((target_clones ("default", "dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error "redefinition of .foo
\\\[\\\[target_clones\\(.default., .dotprod., .sve.\\)\\\]\\\]." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error1.c
b/gcc/testsuite/gcc.target/aarch64/mv-error1.c
new file mode 100644
index 00000000000..61c9af276e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("default"))) int
+foo ();
+
+__attribute__ ((target_version ("default"))) int
+foo () { return 1; } /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.default.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; } /* { dg-error "conflicting types for .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\].; have .float\\(void\\)." } */
+
+__attribute__ ((target_version ("sve"))) int
+foo2 () { return 1; } /* { dg-message "previous definition of .foo2
\\\[\\\[target_version\\(.sve.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo2 () { return 3; } /* { dg-error "conflicting types for .foo2
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\].; have .float\\(void\\)." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error10.c
b/gcc/testsuite/gcc.target/aarch64/mv-error10.c
new file mode 100644
index 00000000000..218f103a8f4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error10.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+void
+bar ()
+{
+ __attribute__ ((target_version ("dotprod"))) int
+ foo1 (); /* { dg-message "versioned declarations are only allowed at file
scope" } */
+
+ __attribute__ ((target_version ("simd"))) int
+ foo2 () { return 1; } /* { dg-message "versioned definitions are only
allowed at file scope" } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error2.c
b/gcc/testsuite/gcc.target/aarch64/mv-error2.c
new file mode 100644
index 00000000000..19d961d0a5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error2.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; } /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\]. with type .float\\(void\\)." } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; } /* { dg-error "redefinition of .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\]." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error3.c
b/gcc/testsuite/gcc.target/aarch64/mv-error3.c
new file mode 100644
index 00000000000..451ce028c65
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error3.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; }
+
+__attribute__ ((target_version ("default"))) float
+foo () { return 3; } /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.default.\\)\\\]\\\]. with type .float\\(void\\)." } */
+
+__attribute__ ((target_version ("default"))) float
+foo () { return 3; } /* { dg-error "redefinition of .foo
\\\[\\\[target_version\\(.default.\\)\\\]\\\]." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error4.c
b/gcc/testsuite/gcc.target/aarch64/mv-error4.c
new file mode 100644
index 00000000000..44d3195590d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error4.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("test"))) float
+foo () { return 3; } /* { dg-error "invalid feature modifier .test. of value
.test. in .target_version. attribute" } */
+
+__attribute__ ((target_version ("sve+test"))) float
+foo2 () { return 3; } /* { dg-error "invalid feature modifier .test. of value
.sve.test. in .target_version. attribute" } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error5.c
b/gcc/testsuite/gcc.target/aarch64/mv-error5.c
new file mode 100644
index 00000000000..776b80a45b6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error5.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("sve+sve2"))) int
+foo(); /* { dg-message "previous declaration of .foo
\\\[\\\[target_version\\(.sve\\\+sve2.\\)\\\]\\\]. with type .int\\(void\\)." }
*/
+
+int bar () { return foo (); } /* { dg-error "implicit declaration of function
.foo." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error6.c
b/gcc/testsuite/gcc.target/aarch64/mv-error6.c
new file mode 100644
index 00000000000..afc71a44e73
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error6.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("sve+sve2"))) int
+foo () {
+ return 1;
+}
+
+__attribute__ ((target_version ("sve"))) int
+foo () { /* { dg-message "previous definition of .foo
\\\[\\\[target_version\\(.sve.\\)\\\]\\\]. with type .int\\(void\\)." } */
+ return 1;
+}
+
+int bar () { return foo (); } /* { dg-error "implicit declaration of function
.foo." } */
+
+__attribute__ ((target_version ("sve+sve2"))) int
+foo2(); /* { dg-message "previous declaration of .foo2
\\\[\\\[target_version\\(.sve\\\+sve2.\\)\\\]\\\]. with type .int\\(void\\)." }
*/
+
+int bar2 () { return foo2 (); } /* { dg-error "implicit declaration of
function .foo2." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error7.c
b/gcc/testsuite/gcc.target/aarch64/mv-error7.c
new file mode 100644
index 00000000000..68db9783ce6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error7.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("dotprod"))) int
+foo (); /* { dg-message "previous declaration of .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+__attribute__ ((target_version ("sve+sve2"))) int
+foo ();
+
+int bar () { return foo (); } /* { dg-error "implicit declaration of function
.foo." } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error8.c
b/gcc/testsuite/gcc.target/aarch64/mv-error8.c
new file mode 100644
index 00000000000..7599df189e4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error8.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("default"))) int
+foo (int a, int (*b)[4]) { return 1; }
+
+int bar(void) {
+ __attribute__ ((target_version ("dotprod"))) int
+ foo (int a, int (*b)[5]) { return 3; } /* { dg-error "versioned definitions
are only allowed at file scope" } */
+
+ return 1;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/mv-error9.c
b/gcc/testsuite/gcc.target/aarch64/mv-error9.c
new file mode 100644
index 00000000000..dc982e9d415
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mv-error9.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_version ("dotprod"))) int
+foo (); /* { dg-message "previous declaration of .foo
\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\]. with type .int\\(void\\)." } */
+
+int
+bar ()
+{
+ return foo (); /* { dg-error "implicit declaration of function .foo." } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/mvc-error1.c
b/gcc/testsuite/gcc.target/aarch64/mvc-error1.c
new file mode 100644
index 00000000000..482d0a71e67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mvc-error1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_clones ("default, dotprod"))) float
+foo (); /* { dg-message "previous declaration of .foo
\\\[\\\[target_clones\\(.default., .dotprod.\\)\\\]\\\]." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error ".foo \\\[\\\[target_clones\\(.dotprod.,
.sve.\\)\\\]\\\]. conflicts with overlapping .target_clone. declaration" } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mvc-error2.c
b/gcc/testsuite/gcc.target/aarch64/mvc-error2.c
new file mode 100644
index 00000000000..482d0a71e67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mvc-error2.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((target_clones ("default, dotprod"))) float
+foo (); /* { dg-message "previous declaration of .foo
\\\[\\\[target_clones\\(.default., .dotprod.\\)\\\]\\\]." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error ".foo \\\[\\\[target_clones\\(.dotprod.,
.sve.\\)\\\]\\\]. conflicts with overlapping .target_clone. declaration" } */
diff --git a/gcc/testsuite/gcc.target/aarch64/mvc-warning1.c
b/gcc/testsuite/gcc.target/aarch64/mvc-warning1.c
new file mode 100644
index 00000000000..1bae38cceeb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/mvc-warning1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O0" } */
+
+__attribute__((target_clones("default", "dotprod", "sve+sve2")))
+int foo () {
+ return 1;
+}
+
+__attribute__((target_clones("invalid1")))
+int foo () { /* { dg-warning "invalid feature modifier .invalid1. in version
.invalid1. for .target_clones. attribute" } */
+ return 2;
+}
--
2.34.1