123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- using NUnit.Framework;
- using System;
- using System.Runtime.InteropServices;
- using Unity.Burst;
- using Unity.Mathematics;
-
- namespace Burst.Compiler.IL.Tests
- {
- /// <summary>
- /// Tests types
- /// </summary>
- [BurstCompile]
- internal class NotSupported
- {
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_OnlyStaticMethodsAllowed)]
- public int InstanceMethod()
- {
- return 1;
- }
-
- [TestCompiler(1, ExpectCompilerException = true, ExpectedDiagnosticIds = new[] { DiagnosticId.ERR_CallingManagedMethodNotSupported })]
- public static int TestDelegate(int data)
- {
- return ProcessData(i => i + 1, data);
- }
-
- private static int ProcessData(Func<int, int> yo, int value)
- {
- return yo(value);
- }
-
- public struct HasMarshalAttribute
- {
- [MarshalAs(UnmanagedType.U1)] public bool A;
- }
-
- //[TestCompiler(ExpectCompilerException = true)]
- [TestCompiler] // Because MarshalAs is used in mathematics we cannot disable it for now
- public static void TestStructWithMarshalAs()
- {
- #pragma warning disable 0219
- var x = new HasMarshalAttribute();
- #pragma warning restore 0219
- }
-
- public struct HasMarshalAsSysIntAttribute
- {
- [MarshalAs(UnmanagedType.SysInt)] public bool A;
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_MarshalAsOnFieldNotSupported)]
- public static void TestStructWithMarshalAsSysInt()
- {
- #pragma warning disable 0219
- var x = new HasMarshalAsSysIntAttribute();
- #pragma warning restore 0219
- }
-
- [TestCompiler(42, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_MarshalAsOnParameterNotSupported)]
- public static void TestMethodWithMarshalAsParameter([MarshalAs(UnmanagedType.I8)] int x)
- {
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_MarshalAsOnReturnTypeNotSupported)]
- [return: MarshalAs(UnmanagedType.I8)]
- public static int TestMethodWithMarshalAsReturnType()
- {
- return 42;
- }
-
- private static float3 a = new float3(1, 2, 3);
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoadingFromNonReadonlyStaticFieldNotSupported)]
- public static bool TestStaticLoad()
- {
- var cmp = a == new float3(1, 2, 3);
-
- return cmp.x && cmp.y && cmp.z;
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoadingFromManagedNonReadonlyStaticFieldNotSupported)]
- public static void TestStaticStore()
- {
- a.x = 42;
- }
-
- private interface ISomething
- {
- void DoSomething();
- }
-
- private struct Something : ISomething
- {
- public byte A;
-
- public void DoSomething()
- {
- A = 42;
- }
- }
-
- private static ISomething something = new Something { A = 13 };
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoadingFromManagedNonReadonlyStaticFieldNotSupported)]
- public static void TestStaticInterfaceStore()
- {
- something.DoSomething();
- }
-
- private static int i = 42;
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoadingFromNonReadonlyStaticFieldNotSupported)]
- public static int TestStaticIntLoad()
- {
- return i;
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_InstructionStsfldNotSupported)]
- public static void TestStaticIntStore()
- {
- i = 13;
- }
-
- public delegate char CharbyValueDelegate(char c);
-
- #if BURST_TESTS_ONLY
- [BurstCompile]
- #endif
- public static char CharbyValue(char c)
- {
- return c;
- }
-
- public struct CharbyValueFunc : IFunctionPointerProvider
- {
- public FunctionPointer<CharbyValueDelegate> FunctionPointer;
-
- public object FromIntPtr(IntPtr ptr)
- {
- return new CharbyValueFunc() { FunctionPointer = new FunctionPointer<CharbyValueDelegate>(ptr) };
- }
- }
-
- [TestCompiler(nameof(CharbyValue), 0x1234, ExpectCompilerException = true, ExpectedDiagnosticIds = new[] { DiagnosticId.ERR_TypeNotBlittableForFunctionPointer, DiagnosticId.ERR_StructsWithNonUnicodeCharsNotSupported })]
- public static int TestCharbyValue(ref CharbyValueFunc fp, int i)
- {
- var c = (char)i;
- return fp.FunctionPointer.Invoke(c);
- }
-
- struct Halfs
- {
- public static readonly half3 h3_h = new half3(new half(42.0f));
- public static readonly half3 h3_d = new half3(0.5);
- public static readonly half3 h3_v2s = new half3(new half2(new half(1.0f), new half(2.0f)), new half(0.5f));
- public static readonly half3 h3_sv2 = new half3(new half(0.5f), new half2(new half(1.0f), new half(2.0f)));
- public static readonly half3 h3_v3 = new half3(new half(0.5f), new half(42.0f), new half(13.0f));
- }
-
- [TestCompiler]
- public static float TestStaticHalf3()
- {
- var result = (float3)Halfs.h3_h + Halfs.h3_d + Halfs.h3_v2s + Halfs.h3_sv2 + Halfs.h3_v3;
- return result.x + result.y + result.z;
- }
-
- [TestCompiler(42, 13, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_AssertTypeNotSupported)]
- public static void TestAreEqual(int a, int b)
- {
- Assert.AreEqual(a, b, "unsupported", new object[0]);
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_InstructionLdtokenTypeNotSupported)]
- public static bool TestTypeof()
- {
- return typeof(int).IsPrimitive;
- }
-
- public class AwfulClass
- {
- public int Foo;
- }
-
- public struct BetterStruct
- {
- public int Foo;
- }
-
- public struct MixedStaticInits
- {
- public static readonly AwfulClass AC = new AwfulClass { Foo = 42 };
- public static readonly BetterStruct BS = new BetterStruct { Foo = 42 };
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticIds = new[] { DiagnosticId.ERR_InstructionNewobjWithManagedTypeNotSupported, DiagnosticId.ERR_ManagedStaticConstructor })]
- public static int TestMixedStaticInits()
- {
- return MixedStaticInits.BS.Foo;
- }
-
- public struct StaticArrayWrapper
- {
- private const int ArrayLength = 4;
- public static readonly int[] StaticArray = new int[4];
-
- static StaticArrayWrapper()
- {
- for (int i = 0; i < ArrayLength; ++i)
- {
- StaticArray[i] = i;
- }
- }
- }
-
- [TestCompiler]
- public unsafe static int TestStaticArrayWrapper()
- {
- return StaticArrayWrapper.StaticArray[0];
- }
-
- class NestedArrayHolder
- {
- public static readonly int4[][] SomeOffsetThing =
- {
- new[] {new int4(0), new int4(0, 0, 1, 0), new int4(0, 1, 0, 0), new int4(0, 1, 1, 0)},
- new[] {new int4(0), new int4(1, 0, 0, 0), new int4(0, 0, 1, 0), new int4(1, 0, 1, 0)},
- new[] {new int4(0), new int4(0, 1, 0, 0), new int4(1, 0, 0, 0), new int4(1, 1, 0, 0)},
- };
- }
-
- [TestCompiler]
- public unsafe static int TestNestedManagedArrays()
- {
- return NestedArrayHolder.SomeOffsetThing[0][0].x;
- }
-
- public static readonly int[,] SomeMultiDimensionalThing = new int[2, 4]
- {
- { 1, 2, 3, 4 },
- { -1, -2, -3, -4 },
- };
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticIds = new[] { DiagnosticId.ERR_ConstructorNotSupported, DiagnosticId.ERR_MultiDimensionalArrayUnsupported })]
- public static int TestMultiDimensionalArray() => SomeMultiDimensionalThing[1, 1];
- }
- }
|