Summary
SGameplayTagChip.h declares the widget with SLATE_DECLARE_WIDGET(SGameplayTagChip, SCompoundWidget), which expands with NO_API, so GameplayTagsEditor does not export SGameplayTagChip::PrivateRegisterAttributes. The chip’s constructor and Construct are GAMEPLAYTAGSEDITOR_API, and its sibling widgets in the same module use SLATE_DECLARE_WIDGET_API(…, GAMEPLAYTAGSEDITOR_API). Any other module that constructs the chip (SNew(SGameplayTagChip)) fails to link with clang (Linux). MSVC links the same code. The fix is one line in the header.
What Type of Bug are you experiencing?
Editor
Steps to Reproduce
- In a UE 5.8.3 project, add an editor module (or a plugin’s editor module) that depends on GameplayTagsEditor, Slate and SlateCore.
- In that module,
#include "SGameplayTagChip.h"and construct the widget, for example:SNew(SGameplayTagChip).Text(FText::FromString(TEXT("A.B"))) - Build the editor target on Linux (clang, modular editor build).
Real-world case: the Flow Graph plugin 2.4 (GitHub - MothCocoon/FlowGraph: Design-agnostic node system for scripting game’s flow in Unreal Engine · GitHub) does exactly this in FlowEditor’s FlowIdentityCustomization.cpp, and its editor module fails to link on Linux. That is the case we measured.
Expected Result
The module links. The chip’s constructor and Construct are already exported (GAMEPLAYTAGSEDITOR_API); only the widget declaration macro lacks the export.
Observed Result
The link fails (clang 20.1.8, UE 5.8.3, Linux; paths abridged):
ld.lld: error: undefined symbol: SGameplayTagChip::PrivateRegisterAttributes(FSlateAttributeDescriptor::FInitializer&)
>>> referenced by SGameplayTagChip.h:19 (../Plugins/Editor/GameplayTagsEditor/Source/GameplayTagsEditor/Public/SGameplayTagChip.h:19)
>>> .../FlowEditor/Module.FlowEditor.1.cpp.o:(SGameplayTagChip::GetPrivateWidgetClass())
The same source built with MSVC 14.44 (Win64) compiles and links.
Affects Versions
5.8
Platform(s)
Linux
Additional Notes
Affects 5.8.3; the header line is unchanged on ue5-main as of 2026-11-01. Platform: Linux. Windows (MSVC) links; Mac (clang) was not checked.
Cause: SLATE_DECLARE_WIDGET(WidgetType, ParentType) is SLATE_DECLARE_WIDGET_API(WidgetType, ParentType, NO_API) (SlateControlledConstruction.h). The macro’s inline GetPrivateWidgetClass() takes &WidgetType::PrivateRegisterAttributes, and PrivateRegisterAttributes is declared “static ModuleApiDefine void PrivateRegisterAttributes(FSlateAttributeInitializer&);”. With NO_API it is not exported from GameplayTagsEditor, so a module that constructs the chip with clang needs a symbol the module does not provide. Inside the engine only GameplayTagsEditor constructs the chip (SGameplayTagCombo, SGameplayTagContainerCombo), so the engine itself never hits this.
Its siblings in the same module are declared with the export: SGameplayTagCombo, SGameplayTagContainerCombo and SGameplayTagQueryEntryBox all use SLATE_DECLARE_WIDGET_API(…, GAMEPLAYTAGSEDITOR_API).
Fix, Engine/Plugins/Editor/GameplayTagsEditor/Source/GameplayTagsEditor/Public/SGameplayTagChip.h line 19:
- SLATE_DECLARE_WIDGET(SGameplayTagChip, SCompoundWidget)
+ SLATE_DECLARE_WIDGET_API(SGameplayTagChip, SCompoundWidget, GAMEPLAYTAGSEDITOR_API)
With that change, the same Linux build links (tested on 5.8.3).
Video / callstack: none (a link error; the linker output is in Observed Result).