From 90c34e3db4fdc7be79c62bd91905a2a84bbd673e Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 10 Jul 2025 21:14:16 -0700 Subject: Ensure generic constraints are checked before inner extension. (#7685) * Ensure generic constraints are checked before inner extension. * Add warning for non-standard generic extension. * Fix tests. * Fix test. * Ban interface types from equality constraints. * Fix. --- tests/bugs/gh-5140.slang | 2 + ...neric-constraint-equality-right-hand-side.slang | 36 +++++++++++++++ tests/diagnostics/non-standard-extension.slang | 17 +++++++ .../extensions/generic-extension-2.slang | 2 + .../extensions/generic-extension-5.slang | 52 ++++++++++++++++++++++ tests/language-feature/overloaded-subscript.slang | 1 + 6 files changed, 110 insertions(+) create mode 100644 tests/diagnostics/generic-constraint-equality-right-hand-side.slang create mode 100644 tests/diagnostics/non-standard-extension.slang create mode 100644 tests/language-feature/extensions/generic-extension-5.slang (limited to 'tests') diff --git a/tests/bugs/gh-5140.slang b/tests/bugs/gh-5140.slang index 23d9b3a23..bf18b04a6 100644 --- a/tests/bugs/gh-5140.slang +++ b/tests/bugs/gh-5140.slang @@ -3,6 +3,8 @@ //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +#pragma warning(disable:30856) + public interface A { } diff --git a/tests/diagnostics/generic-constraint-equality-right-hand-side.slang b/tests/diagnostics/generic-constraint-equality-right-hand-side.slang new file mode 100644 index 000000000..c49fe2035 --- /dev/null +++ b/tests/diagnostics/generic-constraint-equality-right-hand-side.slang @@ -0,0 +1,36 @@ +//TEST:SIMPLE(filecheck=CHECK): +interface IGen +{ + associatedtype TB; + int getVal(); +} + +interface Wrapper +{} + +struct Foo1 : IGen +{ + typealias TB = Wrapper; // `Wrapper` also fails. + int val = 0; + int getVal() + { + return val; + } +} + +struct Logic> +{ + int val = 0; +} + +extension Logic + where C1 : IGen + //CHECK: ([[# @LINE+1]]): error 30404: + where C1.TB == Wrapper +{ + [mutating] + void setVal(int dataIn) + { + val = dataIn; + } +} diff --git a/tests/diagnostics/non-standard-extension.slang b/tests/diagnostics/non-standard-extension.slang new file mode 100644 index 000000000..d6a4350a4 --- /dev/null +++ b/tests/diagnostics/non-standard-extension.slang @@ -0,0 +1,17 @@ +//TEST:SIMPLE(filecheck=CHECK): -warnings-as-errors 30856 + +interface ICompatibleWith {} +interface IBase {} +struct INT : IBase {} +struct FLOAT : IBase {} + +extension EX : ICompatibleWith {} +extension EY : ICompatibleWith {} + +struct VECTOR {} + +// CHECK: ([[# @LINE+1]]): error 30856: the extension is non-standard +extension> VECTOR : ICompatibleWith> {} + +void main() +{} \ No newline at end of file diff --git a/tests/language-feature/extensions/generic-extension-2.slang b/tests/language-feature/extensions/generic-extension-2.slang index 2728a73d6..d56455e3d 100644 --- a/tests/language-feature/extensions/generic-extension-2.slang +++ b/tests/language-feature/extensions/generic-extension-2.slang @@ -1,4 +1,6 @@ //TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj + +#pragma warning(disable:30856) interface IFoo { T getFirst(); diff --git a/tests/language-feature/extensions/generic-extension-5.slang b/tests/language-feature/extensions/generic-extension-5.slang new file mode 100644 index 000000000..e6466d614 --- /dev/null +++ b/tests/language-feature/extensions/generic-extension-5.slang @@ -0,0 +1,52 @@ +//TEST:INTERPRET(filecheck=CHECK): +interface IGen +{ + associatedtype TB; + TB getVal(); +} + +struct Foo1 : IGen +{ + typealias TB = int; + int val = 0; + TB getVal() + { + return val; + } +} + +struct Foo2 : IGen +{ + typealias TB = int; + int val = 0; + TB getVal() + { + return val; + } +} + +struct Logic, C2 : IGen> +{ + int val = 0; +} + +extension Logic + where C1 : IGen + where C2 : IGen + where C1.TB == C2.TB +{ + [mutating] + void setVal(int dataIn) + { + val = dataIn; + } +} + +void main() +{ + Logic, Foo2> logic; + logic.setVal(42); + int result = logic.val; + printf("Result: %d\n", result); + // CHECK: Result: 42 +} \ No newline at end of file diff --git a/tests/language-feature/overloaded-subscript.slang b/tests/language-feature/overloaded-subscript.slang index 68ad1111a..e928e97ec 100644 --- a/tests/language-feature/overloaded-subscript.slang +++ b/tests/language-feature/overloaded-subscript.slang @@ -13,6 +13,7 @@ interface IRWBuf : IBuf void write(int x, T v); } +#pragma warning(disable:30856) extension> U { __subscript(int x) -> T { get { return read(x); } } -- cgit v1.2.3