diff options
| author | Julius Ikkala <julius.ikkala@gmail.com> | 2025-01-10 03:24:00 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-10 01:24:00 +0000 |
| commit | e8217c70072080e9d1f499cb670cc08f146818f2 (patch) | |
| tree | aba8a73dc7dcbd04fdb91dfb82c5b699e688268c | |
| parent | b72e62f5caacd16cb98ee4a746ad06a536691e27 (diff) | |
Fix implicit string conversion breaking NativeStrings (#6035)
* Fix implicit string conversion breaking NativeStrings
* Allow string literals to coerce to either string type
* Add test for CPU string passing
---------
Co-authored-by: Yong He <yonghe@outlook.com>
| -rw-r--r-- | source/slang/core.meta.slang | 6 | ||||
| -rw-r--r-- | source/slang/slang-check-conversion.cpp | 4 | ||||
| -rw-r--r-- | tests/cpu-program/string-passing.slang | 17 | ||||
| -rw-r--r-- | tests/cpu-program/string-passing.slang.expected | 6 |
4 files changed, 31 insertions, 2 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang index adb7470dd..f0324ba1a 100644 --- a/source/slang/core.meta.slang +++ b/source/slang/core.meta.slang @@ -1463,6 +1463,11 @@ struct String __intrinsic_op($(kIROp_MakeString)) __init(double val); + [require(cpp)] + __implicit_conversion($(kConversionCost_None)) + __intrinsic_op($(kIROp_MakeString)) + __init(NativeString value); + /// Returns the length of the string. [require(cpp)] int64_t getLength(); @@ -1502,6 +1507,7 @@ struct NativeString property int length { [__unsafeForceInlineEarly] get{return getLength();} } + __implicit_conversion($(kConversionCost_None)) __intrinsic_op($(kIROp_getNativeStr)) __init(String value); }; diff --git a/source/slang/slang-check-conversion.cpp b/source/slang/slang-check-conversion.cpp index 7cb71a1bd..248c83fe5 100644 --- a/source/slang/slang-check-conversion.cpp +++ b/source/slang/slang-check-conversion.cpp @@ -785,8 +785,8 @@ bool SemanticsVisitor::_coerce( return true; } - // If both are string types we assume they are convertable in both directions - if (as<StringTypeBase>(fromType) && as<StringTypeBase>(toType)) + // Assume string literals are convertible to any string type. + if (as<StringLiteralExpr>(fromExpr) && as<StringTypeBase>(toType)) { if (outToExpr) *outToExpr = fromExpr; diff --git a/tests/cpu-program/string-passing.slang b/tests/cpu-program/string-passing.slang new file mode 100644 index 000000000..3ae736a57 --- /dev/null +++ b/tests/cpu-program/string-passing.slang @@ -0,0 +1,17 @@ +//TEST:EXECUTABLE: + +void printer(NativeString string) +{ + printf(string); +} + +void indirectPrinter(String string) +{ + printer(string); +} + +export __extern_cpp int main() +{ + indirectPrinter("success\n"); + return 0; +} diff --git a/tests/cpu-program/string-passing.slang.expected b/tests/cpu-program/string-passing.slang.expected new file mode 100644 index 000000000..0eb55acbf --- /dev/null +++ b/tests/cpu-program/string-passing.slang.expected @@ -0,0 +1,6 @@ +result code = 0 +standard error = { +} +standard output = { +success +} |
