Function multiversioning is compatible with Arm streaming mode as long as the same calling convention is used across all function versions.
Use a text editor to create a file named streaming.c with the code below:
    
        
        
__attribute__((target_clones("sve", "simd")))
void ok_arm_streaming(void) __arm_streaming {}
__arm_locally_streaming __attribute__((target_version("sme2")))
void ok_arm_streaming(void) __arm_streaming {}
__attribute__((target_version("default")))
void ok_arm_streaming(void) __arm_streaming {}
__attribute__((target_clones("sve", "simd")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}
__arm_locally_streaming __attribute__((target_version("sme2")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}
__attribute__((target_version("default")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}
__arm_locally_streaming __attribute__((target_clones("sve", "simd")))
void ok_no_streaming(void) {}
__attribute__((target_version("sme2")))
void ok_no_streaming(void) {}
__attribute__((target_version("default")))
void ok_no_streaming(void) {}
__attribute__((target_clones("sve", "simd")))
void bad_mixed_streaming(void) {}
__attribute__((target_version("sme2")))
void bad_mixed_streaming(void) __arm_streaming {} // expected-error: declaration has a different calling convention
__attribute__((target_version("default")))
void bad_mixed_streaming(void) __arm_streaming_compatible {} // expected-error: declaration has a different calling convention
__arm_locally_streaming __attribute__((target_version("dotprod")))
void bad_mixed_streaming(void) __arm_streaming {} // expected-error: declaration has a different calling convention
void n_caller(void) {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}
void s_caller(void) __arm_streaming {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}
void sc_caller(void) __arm_streaming_compatible {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}
    
To compile with Clang, run:
    
        
        
clang --target=aarch64-linux-gnu -march=armv8-a+sme --rtlib=compiler-rt -c streaming.c