onCodePathSegmentLoop(fromSegment, toSegment) {
				if (!(funcInfo.isConstructor && funcInfo.hasExtends)) {
					return;
				}

				funcInfo.codePath.traverseSegments(
					{ first: toSegment, last: fromSegment },
					(segment, controller) => {
						const info = segInfoMap[segment.id];

						// skip segments after the loop
						if (!info) {
							controller.skip();
							return;
						}

						const seenPrevSegments =
							segment.prevSegments.filter(hasSegmentBeenSeen);
						const calledInSomePreviousPaths =
							seenPrevSegments.some(isCalledInSomePath);
						const calledInEveryPreviousPaths =
							seenPrevSegments.every(isCalledInEveryPath);

						info.calledInSomePaths ||= calledInSomePreviousPaths;
						info.calledInEveryPaths ||= calledInEveryPreviousPaths;

						// If flags become true anew, reports the valid nodes.
						if (calledInSomePreviousPaths) {
							const nodes = info.validNodes;

							info.validNodes = [];

							for (let i = 0; i < nodes.length; ++i) {
								const node = nodes[i];

								context.report({
									messageId: "duplicate",
									node,
								});
							}
						}
					},
				);
			}
Update information of the code path segment when a code path was
looped.
@param {CodePathSegment} fromSegment The code path segment of the
     end of a loop.
@param {CodePathSegment} toSegment A code path segment of the head
     of a loop.
@returns {void}