Skip to content

Commit 0ba2191

Browse files
Adding documentation for CA1516 - Use cross-platform intrinsics (#47276)
1 parent 5310604 commit 0ba2191

File tree

5 files changed

+109
-1
lines changed

5 files changed

+109
-1
lines changed

docs/fundamentals/code-analysis/code-quality-rule-options.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ This section lists the available configuration options for code analyzers. For m
135135
136136
| Description | Allowable values | Default value | Configurable rules |
137137
|-------------|------------------|---------------|--------------------|
138-
| Specifies that code in a project that generates this type of assembly should be analyzed | One or more fields of the <xref:Microsoft.CodeAnalysis.OutputKind> enumeration<br/><br/>Separate multiple values with a comma (,) | All output kinds | [CA1515](quality-rules/ca1515.md) [CA2007](quality-rules/ca2007.md) |
138+
| Specifies that code in a project that generates this type of assembly should be analyzed | One or more fields of the <xref:Microsoft.CodeAnalysis.OutputKind> enumeration<br/><br/>Separate multiple values with a comma (,) | All output kinds | [CA1515](quality-rules/ca1515.md), [CA1516](quality-rules/ca1516.md), [CA2007](quality-rules/ca2007.md) |
139139
140140
### required_modifiers
141141
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
---
2+
title: "CA1516: Use cross-platform intrinsics"
3+
description: "Learn about code analyzer rule CA1516 - Use cross-platform intrinsics"
4+
ms.date: 07/09/2025
5+
ms.topic: reference
6+
f1_keywords:
7+
- CA1516
8+
- UseCrossPlatformIntrinsicsAnalyzer
9+
helpviewer_keywords:
10+
- CA1516
11+
author: TannerGooding
12+
dev_langs:
13+
- CSharp
14+
---
15+
16+
# CA1516: Use cross-platform intrinsics
17+
18+
| Property | Value |
19+
|-------------------------------------|------------------------------------------------|
20+
| **Rule ID** | CA1516 |
21+
| **Title** | Use cross-platform intrinsics |
22+
| **Category** | [Maintainability](maintainability-warnings.md) |
23+
| **Fix is breaking or non-breaking** | Non-breaking |
24+
| **Enabled by default in .NET 9** | No |
25+
26+
## Cause
27+
28+
A platform or architecture specific intrinsic is used when a cross-platform equivalent exists.
29+
30+
## Rule description
31+
32+
This rule detects usage of platform-specific intrinsics that can be replaced with an equivalent cross-platform intrinsic instead.
33+
34+
## How to fix violations
35+
36+
Apply the fixer that switches the code to use the equivalent cross-platform intrinsic.
37+
38+
## Example
39+
40+
The following code snippet shows three similar violations of CA1516:
41+
42+
```csharp
43+
using System;
44+
using System.Runtime.Intrinsics;
45+
using System.Runtime.Intrinsics.Arm;
46+
using System.Runtime.Intrinsics.Wasm;
47+
using System.Runtime.Intrinsics.X86;
48+
49+
class C
50+
{
51+
Vector128<byte> M1(Vector128<byte> x, Vector128<byte> y) => AdvSimd.Add(x, y);
52+
Vector128<byte> M2(Vector128<byte> x, Vector128<byte> y) => Sse2.Add(x, y);
53+
Vector128<byte> M3(Vector128<byte> x, Vector128<byte> y) => PackedSimd.Add(x, y);
54+
}
55+
```
56+
57+
The following code snippet fixes the violation and would be applied by the fixer:
58+
59+
```csharp
60+
using System;
61+
using System.Runtime.Intrinsics;
62+
63+
class C
64+
{
65+
Vector128<byte> M1(Vector128<byte> x, Vector128<byte> y) => x + y;
66+
Vector128<byte> M2(Vector128<byte> x, Vector128<byte> y) => x + y;
67+
Vector128<byte> M3(Vector128<byte> x, Vector128<byte> y) => x + y;
68+
}
69+
```
70+
71+
Once the fix has been applied, it becomes more obvious that the three methods could be simplified to be a single method that works on all platforms.
72+
73+
## When to suppress warnings
74+
75+
It's safe to suppress a violation of this rule if you're not concerned about the maintainability of your code.
76+
77+
## Suppress a warning
78+
79+
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
80+
81+
```csharp
82+
#pragma warning disable CA1516
83+
// The code that's violating the rule is on this line.
84+
#pragma warning restore CA1516
85+
```
86+
87+
To disable the rule for a file, folder, or project, set its severity to `none` in the [configuration file](../configuration-files.md).
88+
89+
```ini
90+
[*.{cs,vb}]
91+
dotnet_diagnostic.CA1516.severity = none
92+
```
93+
94+
For more information, see [How to suppress code analysis warnings](../suppress-warnings.md).
95+
96+
## Configure code to analyze
97+
98+
You can configure which _output assembly kinds_ to apply this rule to. For example, to only apply this rule to code that produces a console application or a dynamically linked library (that is, not a UI app), add the following key-value pair to an *.editorconfig* file in your project:
99+
100+
```ini
101+
dotnet_code_quality.CA1516.output_kind = ConsoleApplication, DynamicallyLinkedLibrary
102+
```
103+
104+
For more information, see [output_kind](../code-quality-rule-options.md#output_kind).

docs/fundamentals/code-analysis/quality-rules/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ The following table lists code quality analysis rules.
9494
> | [CA1513: Use ObjectDisposedException throw helper](ca1513.md) | Throw helpers are simpler and more efficient than `if` blocks that construct a new exception instance. |
9595
> | [CA1514: Avoid redundant length argument](ca1514.md) | A redundant length argument is used when slicing to the end of a string or buffer. A calculated length can be error-prone and is also unnecessary. |
9696
> | [CA1515: Consider making public types internal](ca1515.md) | Unlike a class library, an application's API isn't typically referenced publicly, so types can be marked internal. |
97+
> | [CA1516: Use cross-platform intrinsics](ca1516.md) | This rule detects usage of platform-specific intrinsics that can be replaced with an equivalent cross-platform intrinsic instead. |
9798
> | [CA1700: Do not name enum values 'Reserved'](ca1700.md) | This rule assumes that an enumeration member that has a name that contains "reserved" is not currently used but is a placeholder to be renamed or removed in a future version. Renaming or removing a member is a breaking change. |
9899
> | [CA1707: Identifiers should not contain underscores](ca1707.md) | By convention, identifier names do not contain the underscore (_) character. This rule checks namespaces, types, members, and parameters. |
99100
> | [CA1708: Identifiers should differ by more than case](ca1708.md) | Identifiers for namespaces, types, members, and parameters cannot differ only by case because languages that target the common language runtime are not required to be case-sensitive. |

docs/fundamentals/code-analysis/quality-rules/maintainability-warnings.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Maintainability rules support library and application maintenance.
3232
| [CA1513: Use ObjectDisposedException throw helper](ca1513.md) | Throw helpers are simpler and more efficient than `if` blocks that construct a new exception instance. |
3333
| [CA1514: Avoid redundant length argument](ca1514.md) | A redundant length argument is used when slicing to the end of a string or buffer. A calculated length can be error-prone and is also unnecessary. |
3434
| [CA1515: Consider making public types internal](ca1515.md) | Unlike a class library, an application's API isn't typically referenced publicly, so types can be marked internal. |
35+
| [CA1516: Use cross-platform intrinsics](ca1516.md) | This rule detects usage of platform-specific intrinsics that can be replaced with an equivalent cross-platform intrinsic instead. |
3536

3637
## See also
3738

docs/navigate/tools-diagnostics/toc.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,8 @@ items:
951951
href: ../../fundamentals/code-analysis/quality-rules/ca1514.md
952952
- name: CA1515
953953
href: ../../fundamentals/code-analysis/quality-rules/ca1515.md
954+
- name: CA1516
955+
href: ../../fundamentals/code-analysis/quality-rules/ca1516.md
954956
- name: Naming rules
955957
items:
956958
- name: Overview

0 commit comments

Comments
 (0)