diff --git a/common/controls.c b/common/controls.c index b9e0d7ab..473ba7a3 100644 --- a/common/controls.c +++ b/common/controls.c @@ -237,6 +237,10 @@ void uiControlSetParent(uiControl *c, uiControl *parent) uiprivProgrammerErrorReparenting("a", "another", uiprivFunc); return; } + if (parentHasCycle(c, parent)) { + uiprivProgrammerErrorControlParentCycle(uiprivFunc); + return; + } c->parent = parent; } diff --git a/common/programmererrors.h b/common/programmererrors.h index 038422be..26f9597b 100644 --- a/common/programmererrors.h +++ b/common/programmererrors.h @@ -75,4 +75,7 @@ uiprivProgrammerError("%s(): cannot set a control with %s parent to have %s parent", \ func, current, next) +#define uiprivProgrammerErrorControlParentCycle(func) \ + uiprivProgrammerError("%s(): cannot create a parent cycle", func) + // } diff --git a/test/controls.c b/test/controls.c index c2b06d58..262c48be 100644 --- a/test/controls.c +++ b/test/controls.c @@ -435,7 +435,7 @@ Test(ControlParentCyclesDisallowed_TwoControls) d = uiNewControl(testControlType(), NULL); uiControlSetParent(c, d); - ctx = beginCheckProgrammerError("TODO"); + ctx = beginCheckProgrammerError("uiControlSetParent(): cannot create a parent cycle"); uiControlSetParent(d, c); endCheckProgrammerError(ctx); @@ -457,7 +457,7 @@ Test(ControlParentCyclesDisallowed_ThreeControls) uiControlSetParent(c, d); uiControlSetParent(d, e); - ctx = beginCheckProgrammerError("TODO"); + ctx = beginCheckProgrammerError("uiControlSetParent(): cannot create a parent cycle"); uiControlSetParent(e, c); endCheckProgrammerError(ctx); @@ -475,7 +475,7 @@ Test(ControlCannotBeItsOwnParent) void *ctx; c = uiNewControl(testControlType(), NULL); - ctx = beginCheckProgrammerError("TODO"); + ctx = beginCheckProgrammerError("uiControlSetParent(): cannot create a parent cycle"); uiControlSetParent(c, c); endCheckProgrammerError(ctx); uiControlFree(c);