Reference in Godot 4: it is RefCounted now

By Eduardo Orellana · Updated

Reference is called RefCounted in Godot 4: the base class for objects freed automatically when nothing refers to them. In a Godot 4 project, extends Reference fails to parse with Could not find base class "Reference".

AppImage, x86_64. Ubuntu 22.04, Debian 12, Fedora 39 or newer.

Intel or AMD Chromebook, with Linux turned on.

Download for macOSDownload for Windows

What Godot is checking

GDScript resolves the class after extends when the script loads. Reference is not a class in Godot 4, so the script fails to parse and nothing in it runs.

The converter carries Reference to RefCounted. A script with no extends line already extends RefCounted, so extends Reference can simply be deleted.

More on this: KinematicBody2D in Godot 4: Could not find base class "KinematicBody2D"

Reproduce it

A Godot 3 script that extends Reference, in a Godot 4 project. The scene is one Node carrying it.

extends Reference

func _ready():
	print("ready")

What Godot 4.7.2 prints

Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org

SCRIPT ERROR: Parse Error: Could not find base class "Reference".
   at: GDScript::reload (res://answers/reference-in-godot-4/repro.gd:1)
ERROR: Failed to load script "res://answers/reference-in-godot-4/repro.gd" with error "Parse error".
   at: load (modules/gdscript/gdscript_resource_format.cpp:46)

Fix it

A data class that extends RefCounted, freed when its last reference goes.

extends Node

class Stats extends RefCounted:
	var hp := 10

func _ready() -> void:
	var stats := Stats.new()
	var watch: WeakRef = weakref(stats)
	print("refs: ", stats.get_reference_count(), ", is RefCounted: ", stats is RefCounted)
	stats = null
	print("freed: ", watch.get_ref() == null)

What the fixed script prints

Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org

refs: 1, is RefCounted: true
freed: true

Verified on Godot 4.7.2

Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 18 October 2026, and the output above is what Godot printed, unedited.

Where the check lives in Godot's source: [renames_map_3_to_4.cpp line 1467, Reference to RefCounted](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1467), [RefCounted class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/RefCounted.xml).

More on this: StreamTexture in Godot 4: Could not find type "StreamTexture"

Questions

Should a data class extend RefCounted or Resource?
Resource when it should be saved to disk or edited in the Inspector; RefCounted when it only lives while the game runs.
Can I free a RefCounted with free()?
No; it frees itself when the last reference goes, and free() is refused.