diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index 760e229b0f..e9a17af857 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -616,8 +616,25 @@ export default class Element extends Node { } if (this.name === 'label') { - const has_input_child = this.children.some(i => (i instanceof Element && a11y_labelable.has(i.name) )); - if (!attribute_map.has('for') && !has_input_child) { + const has_input_child = (children) => { + const has_input = children.some(i => (i instanceof Element && a11y_labelable.has(i.name))); + if (has_input) { + return true; + } + + for (const c of children) { + if (!c.children || c.children.length === 0) { + continue; + } + if (has_input_child(c.children)) { + return true; + } + } + + return false; + }; + + if (!attribute_map.has('for') && !has_input_child(this.children)) { component.warn(this, compiler_warnings.a11y_label_has_associated_control); } } diff --git a/test/validator/samples/a11y-label-has-associated-control/input.svelte b/test/validator/samples/a11y-label-has-associated-control/input.svelte index 43304689dc..acae1bcddf 100644 --- a/test/validator/samples/a11y-label-has-associated-control/input.svelte +++ b/test/validator/samples/a11y-label-has-associated-control/input.svelte @@ -4,3 +4,4 @@ +