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.
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: trueVerified 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.
Related
- Attempted to free a RefCounted object
- Spatial in Godot 4: it is Node3D now, and translation is position
- Every verified Godot 4 answer
- Trying to cast a freed object in Godot 4
- Invalid access to property or key '…' on a base object of type 'Dictionary' in Godot 4
- Cannot call method '…' on a previously freed instance in Godot 4
- Invalid access to property or key on a base object of type 'previously freed' in Godot 4
- Function "…()" not found in base self in Godot 4
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free