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/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-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 ++++++++++++
 15 files changed, 168 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-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..f14f7ed8f02
--- /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 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo. with type .int\\(void\\)." 
} */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) int
+foo () { return 1; } /* { dg-error "redefinition of 
.\\\[\\\[target_clones\\(.dotprod., .sve.\\)\\\]\\\] foo." } */
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..b25dcac6b7c
--- /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 
.\\\[\\\[target_version\\(.default.\\)\\\]\\\] foo. with type .int\\(void\\)." 
} */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error "conflicting types for 
.\\\[\\\[target_clones\\(.dotprod., .sve.\\)\\\]\\\] foo.; 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..a6dd7a2dfff
--- /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 
.\\\[\\\[target_clones\\(.default., .dotprod., .sve.\\)\\\]\\\] foo." } */
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..0fe66b9d880
--- /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 
.\\\[\\\[target_version\\(.default.\\)\\\]\\\] foo. with type .int\\(void\\)." 
} */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; } /* { dg-error "conflicting types for 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo.; have .float\\(void\\)." } 
*/
+
+__attribute__ ((target_version ("sve"))) int
+foo2 () { return 1; } /* { dg-message "previous definition of 
.\\\[\\\[target_version\\(.sve.\\)\\\]\\\] foo2. with type .int\\(void\\)." } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo2 () { return 3; } /* { dg-error "conflicting types for 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo2.; have .float\\(void\\)." } 
*/
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..912a32d8a07
--- /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 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo. with type 
.float\\(void\\)." } */
+
+__attribute__ ((target_version ("dotprod"))) float
+foo () { return 3; } /* { dg-error "redefinition of 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo." } */
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..7c5689b5cb4
--- /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 
.\\\[\\\[target_version\\(.default.\\)\\\]\\\] foo. with type 
.float\\(void\\)." } */
+
+__attribute__ ((target_version ("default"))) float
+foo () { return 3; } /* { dg-error "redefinition of 
.\\\[\\\[target_version\\(.default.\\)\\\]\\\] foo." } */
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..b80d78db7bf
--- /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 
.\\\[\\\[target_version\\(.sve\\\+sve2.\\)\\\]\\\] foo. 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..259b9eae150
--- /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 
.\\\[\\\[target_version\\(.sve.\\)\\\]\\\] foo. 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 
.\\\[\\\[target_version\\(.sve\\\+sve2.\\)\\\]\\\] foo2. 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..051c9728adc
--- /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 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo. 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..4d39456c62c
--- /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 
.\\\[\\\[target_version\\(.dotprod.\\)\\\]\\\] foo. 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..611ef8e1a1f
--- /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 
.\\\[\\\[target_clones\\(.default., .dotprod.\\)\\\]\\\] foo." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error ".\\\[\\\[target_clones\\(.dotprod., 
.sve.\\)\\\]\\\] foo. 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..611ef8e1a1f
--- /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 
.\\\[\\\[target_clones\\(.default., .dotprod.\\)\\\]\\\] foo." } */
+
+__attribute__ ((target_clones ("dotprod", "sve"))) float
+foo () { return 3; } /* { dg-error ".\\\[\\\[target_clones\\(.dotprod., 
.sve.\\)\\\]\\\] foo. 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..bc86f024d84
--- /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 .target_clones. version .invalid1. 
ignored" } */
+  return 2;
+}
-- 
2.34.1

Reply via email to