@@ -7,9 +7,13 @@ import { createVNode } from './create-element';
  * @param {import('./internal').VNode} vnode The virtual DOM element to clone
  * @param {object} props Attributes/props to add when cloning
  * @param {Array<import('./index').ComponentChildren>} rest Any additional arguments will be used as replacement children.
- * @returns {import('./internal').VNode}
+ * @returns {import('./internal').VNode|import('./index').ComponentChildren}
  */
 export function cloneElement(vnode, props) {
+	if (!vnode.type && !vnode._children) {
+		const clone = vnode;
+		return clone;
+	}
 	props = assign(assign({}, vnode.props), props);
 	if (arguments.length > 2) props.children = EMPTY_ARR.slice.call(arguments, 2);
 	let normalizedProps = {};
import { assign } from './util';
import { EMPTY_ARR } from './constants';
import { createVNode } from './create-element';

/**
 * Clones the given VNode, optionally adding attributes/props and replacing its children.
 * @param {import('./internal').VNode} vnode The virtual DOM element to clone
 * @param {object} props Attributes/props to add when cloning
 * @param {Array<import('./index').ComponentChildren>} rest Any additional arguments will be used as replacement children.
 * @returns {import('./internal').VNode}
 */
export function cloneElement(vnode, props) {
	props = assign(assign({}, vnode.props), props);
	if (arguments.length > 2) props.children = EMPTY_ARR.slice.call(arguments, 2);
	let normalizedProps = {};
	for (const i in props) {
		if (i !== 'key' && i !== 'ref') normalizedProps[i] = props[i];
	}

	return createVNode(
		vnode.type,
		normalizedProps,
		props.key || vnode.key,
		props.ref || vnode.ref,
		null
	);
}

Is this meant for supporting `text` vnodes? What's making this fail in the current scenario (master)? Since this code isn't actually cloning it's still returning an equal reference making this node never render. Also adds a lot of code for a scenario that we should be supporting already, maybe the bug is rooted somewhere else?