@@ -3,12 +3,64 @@
void sc_a () [[arm::streaming_compatible]];
void sc_a (); // { dg-error "conflicting types" }
+// Variants of sc_a, checking that the presence of extraneous
+// compatible attributes doesn't affect the rejection.
+
+int sc_a1 (int) [[arm::streaming_compatible, unsequenced]];
+int sc_a1 (int); // { dg-error "conflicting types" }
+
+int sc_a2 (int) [[unsequenced, arm::streaming_compatible]];
+int sc_a2 (int); // { dg-error "conflicting types" }
+
+int sc_a3 (int) [[arm::streaming_compatible]];
+int sc_a3 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int sc_a4 (int) [[arm::streaming_compatible, unsequenced]];
+int sc_a4 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int sc_a5 (int) [[unsequenced, arm::streaming_compatible]];
+int sc_a5 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
void sc_b ();
void sc_b () [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
+// Likewise with sc_b.
+
+int sc_b1 (int) [[reproducible]];
+int sc_b1 (int) [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int sc_b2 (int);
+int sc_b2 (int) [[arm::streaming_compatible, reproducible]]; // { dg-error "conflicting types" }
+
+int sc_b3 (int);
+int sc_b3 (int) [[reproducible, arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int sc_b4 (int) [[reproducible]];
+int sc_b4 (int) [[arm::streaming_compatible, reproducible]]; // { dg-error "conflicting types" }
+
+int sc_b5 (int) [[reproducible]];
+int sc_b5 (int) [[reproducible, arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
void sc_c () [[arm::streaming_compatible]];
void sc_c () {} // { dg-error "conflicting types" }
+// Likewise with sc_c.
+
+int sc_c1 (int) [[arm::streaming_compatible, unsequenced]];
+int sc_c1 (int) {} // { dg-error "conflicting types" }
+
+int sc_c2 (int) [[unsequenced, arm::streaming_compatible]];
+int sc_c2 (int) {} // { dg-error "conflicting types" }
+
+int sc_c3 (int) [[arm::streaming_compatible]];
+int sc_c3 (int) [[unsequenced]] {} // { dg-error "conflicting types" }
+
+int sc_c4 (int) [[arm::streaming_compatible, unsequenced]];
+int sc_c4 (int) [[unsequenced]] {} // { dg-error "conflicting types" }
+
+int sc_c5 (int) [[unsequenced, arm::streaming_compatible]];
+int sc_c5 (int) [[unsequenced]] {} // { dg-error "conflicting types" }
+
void sc_d ();
void sc_d () [[arm::streaming_compatible]] {} // { dg-error "conflicting types" }
@@ -29,15 +81,84 @@ extern void (*sc_h) (); // { dg-error "conflicting types" }
void s_a () [[arm::streaming]];
void s_a (); // { dg-error "conflicting types" }
+// Variants of s_a, checking that the presence of extraneous
+// compatible attributes doesn't affect the rejection.
+
+int s_a1 () [[arm::streaming, gnu::warn_unused_result]];
+int s_a1 (); // { dg-error "conflicting types" }
+
+int s_a2 () [[gnu::warn_unused_result, arm::streaming]];
+int s_a2 (); // { dg-error "conflicting types" }
+
+int s_a3 () [[arm::streaming]];
+int s_a3 () [[gnu::warn_unused_result]]; // { dg-error "conflicting types" }
+
+int s_a4 () [[arm::streaming, gnu::warn_unused_result]];
+int s_a4 () [[gnu::warn_unused_result]]; // { dg-error "conflicting types" }
+
+int s_a5 () [[gnu::warn_unused_result, arm::streaming]];
+int s_a5 () [[gnu::warn_unused_result]]; // { dg-error "conflicting types" }
+
void s_b ();
void s_b () [[arm::streaming]]; // { dg-error "conflicting types" }
+// Likewise with s_b.
+
+int s_b1 (int) [[unsequenced]];
+int s_b1 (int) [[arm::streaming]]; // { dg-error "conflicting types" }
+
+int s_b2 (int);
+int s_b2 (int) [[arm::streaming, unsequenced]]; // { dg-error "conflicting types" }
+
+int s_b3 (int);
+int s_b3 (int) [[unsequenced, arm::streaming]]; // { dg-error "conflicting types" }
+
+int s_b4 (int) [[unsequenced]];
+int s_b4 (int) [[arm::streaming, unsequenced]]; // { dg-error "conflicting types" }
+
+int s_b5 (int) [[unsequenced]];
+int s_b5 (int) [[unsequenced, arm::streaming]]; // { dg-error "conflicting types" }
+
void s_c () [[arm::streaming]];
void s_c () {} // { dg-error "conflicting types" }
+// Likewise with s_c.
+
+int s_c1 (int) [[arm::streaming, reproducible]];
+int s_c1 (int) {} // { dg-error "conflicting types" }
+
+int s_c2 (int) [[reproducible, arm::streaming]];
+int s_c2 (int) {} // { dg-error "conflicting types" }
+
+int s_c3 (int) [[arm::streaming]];
+int s_c3 (int) [[reproducible]] {} // { dg-error "conflicting types" }
+
+int s_c4 (int) [[arm::streaming, reproducible]];
+int s_c4 (int) [[reproducible]] {} // { dg-error "conflicting types" }
+
+int s_c5 (int) [[reproducible, arm::streaming]];
+int s_c5 (int) [[reproducible]] {} // { dg-error "conflicting types" }
+
void s_d ();
void s_d () [[arm::streaming]] {} // { dg-error "conflicting types" }
+// Likewise with s_d.
+
+int s_d1 () [[gnu::warn_unused_result]];
+int s_d1 () [[arm::streaming]] {} // { dg-error "conflicting types" }
+
+int s_d2 ();
+int s_d2 () [[gnu::warn_unused_result, arm::streaming]] {} // { dg-error "conflicting types" }
+
+int s_d3 ();
+int s_d3 () [[arm::streaming, gnu::warn_unused_result]] {} // { dg-error "conflicting types" }
+
+int s_d4 () [[gnu::warn_unused_result]];
+int s_d4 () [[arm::streaming, gnu::warn_unused_result]] {} // { dg-error "conflicting types" }
+
+int s_d4 () [[gnu::warn_unused_result]];
+int s_d4 () [[gnu::warn_unused_result, arm::streaming]] {} // { dg-error "conflicting types" }
+
void s_e () [[arm::streaming]] {}
void s_e (); // { dg-error "conflicting types" }
@@ -55,9 +176,51 @@ extern void (*s_h) (); // { dg-error "conflicting types" }
void mixed_a () [[arm::streaming]];
void mixed_a () [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
+// Variants of mixed_a, checking that the presence of extraneous
+// compatible attributes doesn't affect the rejection.
+
+int mixed_a1 (int) [[arm::streaming, unsequenced]];
+int mixed_a1 (int) [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int mixed_a2 (int) [[unsequenced, arm::streaming]];
+int mixed_a2 (int) [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int mixed_a3 (int) [[arm::streaming]];
+int mixed_a3 (int) [[arm::streaming_compatible, unsequenced]]; // { dg-error "conflicting types" }
+
+int mixed_a4 (int) [[arm::streaming]];
+int mixed_a4 (int) [[unsequenced, arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int mixed_a5 (int) [[arm::streaming, unsequenced]];
+int mixed_a5 (int) [[arm::streaming_compatible, unsequenced]]; // { dg-error "conflicting types" }
+
+int mixed_a6 (int) [[unsequenced, arm::streaming]];
+int mixed_a6 (int) [[arm::streaming_compatible, unsequenced]]; // { dg-error "conflicting types" }
+
+int mixed_a7 (int) [[arm::streaming, unsequenced]];
+int mixed_a7 (int) [[unsequenced, arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
+int mixed_a8 (int) [[unsequenced, arm::streaming]];
+int mixed_a8 (int) [[unsequenced, arm::streaming_compatible]]; // { dg-error "conflicting types" }
+
void mixed_b () [[arm::streaming_compatible]];
void mixed_b () [[arm::streaming]]; // { dg-error "conflicting types" }
+// Likewise with variants of mixed_b (although not including all
+// permutations).
+
+int mixed_b1 (int) [[arm::streaming_compatible]];
+int mixed_b1 (int) [[arm::streaming]]; // { dg-error "conflicting types" }
+
+int mixed_b2 (int) [[arm::streaming_compatible, reproducible]];
+int mixed_b2 (int) [[arm::streaming]]; // { dg-error "conflicting types" }
+
+int mixed_b3 (int) [[arm::streaming_compatible]];
+int mixed_b3 (int) [[arm::streaming, reproducible]]; // { dg-error "conflicting types" }
+
+int mixed_b4 (int) [[arm::streaming_compatible, reproducible]];
+int mixed_b4 (int) [[arm::streaming, reproducible]]; // { dg-error "conflicting types" }
+
void mixed_c () [[arm::streaming]];
void mixed_c () [[arm::streaming_compatible]] {} // { dg-error "conflicting types" }
@@ -120,9 +283,44 @@ void keyword_ok_5 () [[arm::streaming_compatible]];
void keyword_contradiction_1 () __arm_streaming;
void keyword_contradiction_1 (); // { dg-error "conflicting types" }
+// Variants of keyword_contradiction_1, checking that the presence of
+// extraneous compatible attributes doesn't affect the rejection.
+
+int keyword_contradiction_1a (int) __arm_streaming [[unsequenced]];
+int keyword_contradiction_1a (int); // { dg-error "conflicting types" }
+
+int keyword_contradiction_1b (int) [[unsequenced]] __arm_streaming;
+int keyword_contradiction_1b (int); // { dg-error "conflicting types" }
+
+int keyword_contradiction_1c (int) __arm_streaming;
+int keyword_contradiction_1c (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int keyword_contradiction_1d (int) __arm_streaming [[unsequenced]];
+int keyword_contradiction_1d (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int keyword_contradiction_1e (int) [[unsequenced]] __arm_streaming;
+int keyword_contradiction_1e (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
void keyword_contradiction_2 ();
void keyword_contradiction_2 () __arm_streaming; // { dg-error "conflicting types" }
+// Likewise with keyword_contradiction_2.
+
+int keyword_contradiction_2a (int) [[reproducible]];
+int keyword_contradiction_2a (int) __arm_streaming; // { dg-error "conflicting types" }
+
+int keyword_contradiction_2b (int);
+int keyword_contradiction_2b (int) __arm_streaming [[reproducible]]; // { dg-error "conflicting types" }
+
+int keyword_contradiction_2c (int);
+int keyword_contradiction_2c (int) [[reproducible]] __arm_streaming ; // { dg-error "conflicting types" }
+
+int keyword_contradiction_2d (int) [[reproducible]];
+int keyword_contradiction_2d (int) __arm_streaming [[reproducible]]; // { dg-error "conflicting types" }
+
+int keyword_contradiction_2e (int) [[reproducible]];
+int keyword_contradiction_2e (int) [[reproducible]] __arm_streaming ; // { dg-error "conflicting types" }
+
void keyword_contradiction_3 () __arm_streaming;
void keyword_contradiction_3 () [[arm::streaming_compatible]]; // { dg-error "conflicting types" }
@@ -3,9 +3,44 @@
void shared_a () [[arm::inout("za")]];
void shared_a (); // { dg-error "conflicting types" }
+// Variants of shared_a, checking that the presence of extraneous
+// compatible attributes doesn't affect the rejection.
+
+int shared_a1 (int) [[arm::inout("za"), unsequenced]];
+int shared_a1 (int); // { dg-error "conflicting types" }
+
+int shared_a2 (int) [[unsequenced, arm::inout("za")]];
+int shared_a2 (int); // { dg-error "conflicting types" }
+
+int shared_a3 (int) [[arm::inout("za")]];
+int shared_a3 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int shared_a4 (int) [[arm::inout("za"), unsequenced]];
+int shared_a4 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
+int shared_a5 (int) [[unsequenced, arm::inout("za")]];
+int shared_a5 (int) [[unsequenced]]; // { dg-error "conflicting types" }
+
void shared_b ();
void shared_b () [[arm::inout("za")]]; // { dg-error "conflicting types" }
+// Likewise with shared_b.
+
+int shared_b1 () [[gnu::warn_unused_result]];
+int shared_b1 () [[arm::inout("za")]]; // { dg-error "conflicting types" }
+
+int shared_b2 ();
+int shared_b2 () [[arm::inout("za"), gnu::warn_unused_result]]; // { dg-error "conflicting types" }
+
+int shared_b3 ();
+int shared_b3 () [[gnu::warn_unused_result, arm::inout("za")]]; // { dg-error "conflicting types" }
+
+int shared_b4 () [[gnu::warn_unused_result]];
+int shared_b4 () [[arm::inout("za"), gnu::warn_unused_result]]; // { dg-error "conflicting types" }
+
+int shared_b5 () [[gnu::warn_unused_result]];
+int shared_b5 () [[gnu::warn_unused_result, arm::inout("za")]]; // { dg-error "conflicting types" }
+
void shared_c () [[arm::inout("za")]];
void shared_c () {} // { dg-error "conflicting types" }