Unrecoverable editor crash after changing BP struct variable type

Just had this a crash after changing a variable type in my struct.

UE4Editor_Core!FDebug::AssertFailed() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\core\private\misc\assertionmacros.cpp:349]
UE4Editor_BlueprintGraph!FKCHandler_MakeStruct::Compile() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\blueprintgraph\private\makestructhandler.cpp:118]
UE4Editor_KismetCompiler!FKismetCompilerContext::CompileFunction() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\kismetcompiler\private\kismetcompiler.cpp:1894]
UE4Editor_KismetCompiler!FKismetCompilerContext::CompileFunctions() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\kismetcompiler\private\kismetcompiler.cpp:3917]
UE4Editor_Kismet!FBlueprintCompilationManagerImpl::FlushCompilationQueueImpl() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\kismet\private\blueprintcompilationmanager.cpp:749]
UE4Editor_Kismet!FBlueprintCompilationManager::FlushCompilationQueue() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\kismet\private\blueprintcompilationmanager.cpp:1926]
UE4Editor_Engine!UBlueprintGeneratedClass::ConditionalRecompileClass() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\blueprintgeneratedclass.cpp:260]
UE4Editor_CoreUObject!FScopedClassDependencyGather::~FScopedClassDependencyGather() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\blueprint\blueprintsupport.cpp:376]
UE4Editor_CoreUObject!FLinkerLoad::CreateExport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:4010]
UE4Editor_CoreUObject!FLinkerLoad::IndexToObject() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:4227]
UE4Editor_CoreUObject!FLinkerLoad::CreateExport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:3697]
UE4Editor_CoreUObject!FLinkerLoad::CreateExportAndPreload() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2743]
UE4Editor_CoreUObject!FLinkerLoad::LoadAllObjects() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2890]
UE4Editor_CoreUObject!LoadPackageInternal() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1303]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImportInner() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2420]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2176]
UE4Editor_CoreUObject!FLinkerLoad::Verify() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:1955]
UE4Editor_CoreUObject!FLinkerLoad::FinalizeCreation() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:1865]
UE4Editor_CoreUObject!FLinkerLoad::Tick() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:734]
UE4Editor_CoreUObject!FLinkerLoad::CreateLinker() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:437]
UE4Editor_CoreUObject!GetPackageLinker() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linker.cpp:693]
UE4Editor_CoreUObject!LoadPackageInternal() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1215]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImportInner() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2420]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2176]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImportInner() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2468]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2176]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImportInner() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2468]
UE4Editor_CoreUObject!FLinkerLoad::VerifyImport() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:2176]
UE4Editor_CoreUObject!FLinkerLoad::Verify() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:1955]
UE4Editor_CoreUObject!FLinkerLoad::FinalizeCreation() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:1865]
UE4Editor_CoreUObject!FLinkerLoad::Tick() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:734]
UE4Editor_CoreUObject!FLinkerLoad::CreateLinker() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linkerload.cpp:437]
UE4Editor_CoreUObject!GetPackageLinker() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\linker.cpp:693]
UE4Editor_CoreUObject!LoadPackageInternal() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1215]
UE4Editor_CoreUObject!LoadPackage() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1409]
UE4Editor_UnrealEd!UEditorEngine::Map_Load() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\editorserver.cpp:2491]
UE4Editor_UnrealEd!UEditorEngine::HandleMapCommand() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\editorserver.cpp:5991]
UE4Editor_UnrealEd!UEditorEngine::Exec() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\editorserver.cpp:5468]
UE4Editor_UnrealEd!UUnrealEdEngine::Exec() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\unrealedsrv.cpp:672]
UE4Editor_UnrealEd!FEditorFileUtils::LoadMap() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\filehelpers.cpp:2192]
UE4Editor_UnrealEd!FEditorFileUtils::LoadDefaultMapAtStartup() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\filehelpers.cpp:3509]
UE4Editor_UnrealEd!FUnrealEdMisc::OnInit() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\unrealedmisc.cpp:348]
UE4Editor_UnrealEd!EditorInit() [d:\build\++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\unrealedglobals.cpp:97]
UE4Editor!GuardedMain() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\launch.cpp:150]
UE4Editor!GuardedMainWrapper() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:134]
UE4Editor!WinMain() [d:\build\++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:210]
UE4Editor!__scrt_common_main_seh() [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253]
kernel32
ntdll

I couldn’t get back into the editor as it tried to compile the BP on startup!

Reproduction:

  1. Create new empty project.
  2. Create struct with a float value.
  3. Create actor and in the event graph create a ‘make struct’ node and change the default float value then just promote the struct to a variable and set it on begin play.
  4. Compile and save the actor.
  5. Go into the struct and change the float to a boolean type.
  6. Go back to the actor and compile. CRASH
  7. You will now be unable to edit and fix the actor as it crashes on load.

I managed to fix it by adding a check for orphaned pins in the FKCHandler_MakeStruct::Compile method:

Editor\BlueprintGraph\Private\MakeStructHandler.cpp

//@L109
for (UEdGraphPin* Pin : Node->Pins)
	{
		//CrashFix
		if (Pin->bOrphanedPin)
		{
			CompilerContext.MessageLog.Error(*LOCTEXT("MakeStruct_OrphanedPin_Error", "Orphaned struct pin @@").ToString(), Pin);
			continue;
		}
		//-CrashFix
		if (Pin && (Pin != StructPin) && !CompilerContext.GetSchema()->IsMetaPin(*Pin) && (Pin->Direction == EGPD_Input))
		{
			UProperty* BoundProperty = FindField<UProperty>(Node->StructType, *(Pin->PinName));
			check(BoundProperty);

Bump------

Hey -

Thank you for submitting a bug report. I have reproduced this issue and logged a report for it here Unreal Engine Issues and Bug Tracker (UE-49596) . You can track the report’s status as the issue is reviewed by our development staff. Please be aware that this issue may not be prioritized or fixed soon.

Cheers