Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 933e4e5

Browse files
target enum: fix serde impl for target not round tripping
1 parent 39c31ff commit 933e4e5

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

‎crates/rustc_codegen_spirv-target-specs/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub enum SpirvTargetEnv {
6262
Vulkan_1_4,
6363
}
6464

65-
#[derive(Clone, Error)]
65+
#[derive(Clone, Error,Eq,PartialEq)]
6666
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6767
pub enum SpirvTargetParseError {
6868
#[error("Expected `rustc_codegen_spirv` target with prefix `{SPIRV_TARGET_PREFIX}`, got `{0}`")]

‎crates/rustc_codegen_spirv-target-specs/src/serde_feature.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ where
2929
S: Serializer,
3030
{
3131
// cannot use `transpose()` due to target being a ref, not a value
32-
match target {
33-
Some(Ok(_)) | None => Serialize::serialize(target, serializer),
32+
let option = match target {
33+
None => None,
34+
Some(Ok(e)) => Some(*e),
3435
Some(Err(_e)) => Err(Error::custom(
3536
"cannot serialize `target` that failed to parse",
36-
)),
37-
}
37+
))?,
38+
};
39+
Serialize::serialize(&option, serializer)
3840
}
3941

4042
pub fn deserialize_target<'de, D>(
@@ -51,7 +53,8 @@ where
5153

5254
#[cfg(test)]
5355
mod tests {
54-
use crate::SpirvTargetEnv;
56+
use super::*;
57+
use crate::{SpirvTargetEnv, SpirvTargetParseError};
5558

5659
#[test]
5760
fn test_serde_roundtrip() {
@@ -61,4 +64,25 @@ mod tests {
6164
assert_eq!(env, deserialize);
6265
}
6366
}
67+
68+
#[test]
69+
fn test_serde_target_roundtrip() {
70+
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
71+
struct FakeSpirvBuilder {
72+
#[serde(
73+
serialize_with = "serialize_target",
74+
deserialize_with = "deserialize_target"
75+
)]
76+
target: Option<Result<SpirvTargetEnv, SpirvTargetParseError>>,
77+
}
78+
79+
for env in SpirvTargetEnv::iter() {
80+
let builder = FakeSpirvBuilder {
81+
target: Some(Ok(env)),
82+
};
83+
let json = serde_json::to_string(&builder).unwrap();
84+
let deserialize: FakeSpirvBuilder = serde_json::from_str(&json).unwrap();
85+
assert_eq!(builder, deserialize);
86+
}
87+
}
6488
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /