IL2CPP fails inside System.Object... at a loss

I’m trying to compile a project for android using IL2CPP, and getting an error that complains about PointerType<>ByReferenceType conversions. I have tested this on Unity 5.5 and 5.6, with similar errors though a slight difference in exact wording, etc.

I’m at a loss here, it’s complaining about stuff in System.Object.cs?

Failed running C:\Program Files\Unity560f3\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --development-mode --compile-cpp --libil2cpp-static --platform="Android" --architecture="ARMv7" --configuration="Release" --outputpath="E:\ffg_simple\ffg.unity\Temp/StagingArea\assets\bin\Data\Native\armeabi-v7a\libil2cpp.so" --cachedirectory="E:\ffg_simple\ffg.unity\Assets\..\Library\il2cpp_android_armeabi-v7a/il2cpp_cache" --additional-include-directories="C:\Program Files\Unity560f3\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\bdwgc/include" --additional-include-directories="C:\Program Files\Unity560f3\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\libil2cpp/include" --tool-chain-path="E:/android-ndk-r10e" --map-file-parser="C:\Program Files\Unity560f3\Editor\Data\Tools\MapFileParser\MapFileParser.exe" --assembly="E:\ffg_simple\ffg.unity\Temp\StagingArea\assets\bin\Data\Managed\Assembly-CSharp-firstpass.dll" --assembly="E:\ffg_simple\ffg.unity\Temp\StagingArea\assets\bin\Data\Managed\Assembly-CSharp.dll" --assembly="E:\ffg_simple\ffg.unity\Temp\StagingArea\assets\bin\Data\Managed\UnityEngine.UI.dll" --assembly="E:\ffg_simple\ffg.unity\Temp\StagingArea\assets\bin\Data\Managed\UnityEngine.dll" --generatedcppdir="E:\ffg_simple\ffg.unity\Temp\StagingArea\Il2Cpp\il2cppOutput"

stdout:
IL2CPP error for type 'System.Object' in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Object.cs:81
Additional information: Unable to cast object of type 'Mono.Cecil.PointerType' to type 'Mono.Cecil.ByReferenceType'.
il2cpp.exe didn't catch exception: System.InvalidCastException: Unable to cast object of type 'Mono.Cecil.PointerType' to type 'Mono.Cecil.ByReferenceType'.
   at Unity.IL2CPP.MethodBodyWriter.ProcessInstruction(Node node, InstructionBlock block, Instruction& ins)
   at Unity.IL2CPP.MethodBodyWriter.GenerateCodeRecursive(Node node)
   at Unity.IL2CPP.MethodBodyWriter.Generate()
   at Unity.IL2CPP.MethodWriter.WriteMethodBody(MethodReference method, CppCodeWriter methodBodyWriter, IRuntimeMetadataAccess metadataAccess)
   at Unity.IL2CPP.MethodWriter.WriteMethodWithMetadataInitialization(CppCodeWriter writer, String methodSignature, String methodFullName, Action`3 writeMethodBody, String uniqueIdentifier)
   at Unity.IL2CPP.MethodWriter.WriteMethodDefinition(MethodReference method, IMethodCollector methodCollector, IMethodVerifier methodVerifier)
   at Unity.IL2CPP.MethodWriter.WriteMethodDefinitions(IMethodCollector methodCollector, IMethodVerifier methodVerifier)
   at Unity.IL2CPP.SourceWriter.WriteMethodSourceFiles(NPath outputDirectory, String fileName, IEnumerable`1 typeList, IMethodCollector methodCollector, IMethodVerifier methodVerifier, IInteropDataCollector interopDataCollector, SymbolsCollector symbolsCollector, Boolean writeMarshalingDefinitions)
   at Unity.IL2CPP.SourceWriter.Write(AssemblyDefinition assemblyDefinition, ReadOnlyInflatedCollectionCollector allGenerics, NPath outputDir, TypeDefinition[] typeList, AttributeCollection attributeCollection, MethodCollector methodCollector, IMethodVerifier methodVerifier, IInteropDataCollector interopDataCollector, IMetadataCollection metadataCollection, SymbolsCollector symbolsCollector)
   at Unity.IL2CPP.AssemblyConverter.Apply()
   at Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   at Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)
stderr:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Mono.Cecil.PointerType' to type 'Mono.Cecil.ByReferenceType'.
   at Unity.IL2CPP.MethodBodyWriter.ProcessInstruction(Node node, InstructionBlock block, Instruction& ins)
   at Unity.IL2CPP.MethodBodyWriter.GenerateCodeRecursive(Node node)
   at Unity.IL2CPP.MethodBodyWriter.Generate()
   at Unity.IL2CPP.MethodWriter.WriteMethodBody(MethodReference method, CppCodeWriter methodBodyWriter, IRuntimeMetadataAccess metadataAccess)
   at Unity.IL2CPP.MethodWriter.WriteMethodWithMetadataInitialization(CppCodeWriter writer, String methodSignature, String methodFullName, Action`3 writeMethodBody, String uniqueIdentifier)
   at Unity.IL2CPP.MethodWriter.WriteMethodDefinition(MethodReference method, IMethodCollector methodCollector, IMethodVerifier methodVerifier)
   at Unity.IL2CPP.MethodWriter.WriteMethodDefinitions(IMethodCollector methodCollector, IMethodVerifier methodVerifier)
   at Unity.IL2CPP.SourceWriter.WriteMethodSourceFiles(NPath outputDirectory, String fileName, IEnumerable`1 typeList, IMethodCollector methodCollector, IMethodVerifier methodVerifier, IInteropDataCollector interopDataCollector, SymbolsCollector symbolsCollector, Boolean writeMarshalingDefinitions)
   at Unity.IL2CPP.SourceWriter.Write(AssemblyDefinition assemblyDefinition, ReadOnlyInflatedCollectionCollector allGenerics, NPath outputDir, TypeDefinition[] typeList, AttributeCollection attributeCollection, MethodCollector methodCollector, IMethodVerifier methodVerifier, IInteropDataCollector interopDataCollector, IMetadataCollection metadataCollection, SymbolsCollector symbolsCollector)
   at Unity.IL2CPP.AssemblyConverter.Apply()
   at Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   at Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)

UnityEngine.Debug:LogError(Object)
UnityEditorInternal.Runner:RunManagedProgram(String, String, String, CompilerOutputParserBase, Action`1) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildUtils.cs:96)
UnityEditorInternal.IL2CPPBuilder:RunIl2CppWithArguments(List`1, Action`1, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:313)
UnityEditorInternal.IL2CPPBuilder:ConvertPlayerDlltoCpp(ICollection`1, String, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:304)
UnityEditorInternal.IL2CPPBuilder:Run() (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:151)
UnityEditorInternal.IL2CPPUtils:RunIl2Cpp(String, String, IIl2CppPlatformProvider, Action`1, RuntimeClassRegistry, Boolean) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:34)
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

This is a bug in IL2CPP. Can you submit a bug report with a project to reproduce it?

So I tried to create a repro case for this, I can’t really make a limited one, I found that the issue was - when doing this:

*c = default(Foo);

i.e. assigning a default value of a struct to a struct pointer, this is what’s causing this error. But when trying to do this in a small repro case it seems to work…

The main project this is happening is ~40gb and 60000+ lines of code, so it’s not really suitable to be uploaded anywhere.

Can you submit a bug report that just contains the managed assemblies which il2cpp.exe is converting? They should be in the Temp/StagingArea/Data/Managed directory of the project when this error occurs. That might be enough for us to track down the cause of this issue.