Search Issue Tracker
Won't Fix
Votes
0
Found in
2017.4.0f1
2017.4.14f1
Issue ID
1099266
Regression
No
[Mobile][IL2CPP] Devirtualization does not work for abstract classes
To reproduce:
1. Download attached project "Devirtualization_test.zip" and open in Unity
2. Open "SampleScene" scene
3. Set Scripting Backend to IL2CPP
4. Build for iOS or Android
5. Go to "Devirtualization_test/Temp/il2cppOutput/il2cppOutput" and open "Bulk_Assembly-CSharp_0.cpp"
Expected behaviour:
Call to cow.Speak() should read: `String_t* L_18 = Cow_Speak_m1607867742(L_16, /*hidden argument*/NULL);`
Actual behaviour:
Call to cow.Speak() reads: String_t* L_18 = VirtFuncInvoker0< String_t* >::Invoke(4 /* System.String Animal::Speak() */, L_17);
Notes:
- This issue does not reproduce on Windows Standalone and macOS Standalone
- This issue appears only on iOS and Android (IL2CPP)
- You can remove the "sealed" keyword from the Cow class in "FarmAbstract", repeat steps 1 - 5 and notice results are identical
- Could not check on Unity 2017.3 because project becomes corrupted
- Could not check on Unity 2019.1 because of this issue:
https://issuetracker.unity3d.com/issues/crash-on-mono-method-to-ir-when-trying-to-build-after-the-project-was-created-on-older-version-of-unity-net3-dot-5
Reproduced on Unity 2017.4.0f1, 2017.4.15f1, 2018.1.9f2, 2018.2.16f1 and 2018.3.0b10
Add comment
All about bugs
View bugs we have successfully reproduced, and vote for the bugs you want to see fixed most urgently.
Latest issues
- Incorrect Shader keyword activation for Shadows when no Light is present in URP
- Editor freezes when loading a specific AssetBundle
- WebGPU builds with Multithreading enabled crash on Safari
- Set as Value in UI Builder doesn't work across all properties.
- Reorderable ListView inside a ScrollView has a glitchy behavior when trying to reorder items
Resolution Note:
Unfortunately, the devirtualization is not working in this case because the IL bytecode emitted by the C# compiler does not allow IL2CPP to devirtualize the call. The declaring type of the method to call is Animal, not Cow, so IL2CPP cannot safely avoid the virtual call.