diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 71fd352343a6..6e3fb4c55467 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -6343,7 +6343,7 @@ create_cus_hash_table (dwarf2_cu *cu, dwo_file &dwo_file)
 	continue;
 
       std::optional<ULONGEST> signature
-	= lookup_dwo_id (cu, reader.top_level_die ());
+	= lookup_dwo_id (reader.cu (), reader.top_level_die ());
       if (!signature.has_value ())
 	{
 	  complaint (_(DWARF_ERROR_PREFIX
diff --git a/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.c b/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.c
new file mode 100644
index 000000000000..a0f1b76175f7
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.c
@@ -0,0 +1,23 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2021-2024 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+int
+main (int argc, char **argv)
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.exp b/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.exp
new file mode 100644
index 000000000000..2d582602523f
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/fission-with-type-unit.exp
@@ -0,0 +1,105 @@
+# Copyright 2021-2024 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This test is meant to reproduce a bug where having a DWO file with a type unit
+# as the first unit would cause an internal error on CU expansion.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+require dwarf2_support
+
+standard_testfile .c -dw.S -dwo.S
+
+set main_asm_file [standard_output_file $srcfile2]
+set dwo_asm_file [standard_output_file $srcfile3]
+
+# Debug info in the main file.
+Dwarf::assemble $main_asm_file {
+    cu {
+	version 5
+	dwo_id 0xF00D
+    } {
+	compile_unit {
+	    {DW_AT_dwo_name ${::gdb_test_file_name}.dwo DW_FORM_strp}
+	} {}
+    }
+}
+
+# Debug info in the DWO file.
+Dwarf::assemble $dwo_asm_file {
+    tu {
+	fission 1
+	version 5
+    } 0xCAFE "the_type" {
+	type_unit {} {
+	    the_type: base_type {
+		{DW_AT_byte_size 4 DW_FORM_sdata}
+		{DW_AT_encoding  @DW_ATE_signed}
+		{DW_AT_name      int}
+	    }
+	}
+    }
+
+    cu {
+	fission 1
+	version 5
+	dwo_id 0xF00D
+    } {
+	compile_unit {} {
+	    declare_labels int4_type
+
+	    int4_type: DW_TAG_base_type {
+		{DW_AT_byte_size 4 DW_FORM_sdata}
+		{DW_AT_encoding  @DW_ATE_signed}
+		{DW_AT_name      int}
+	    }
+
+	    DW_TAG_variable {
+		{DW_AT_name global_var}
+		{DW_AT_type :$int4_type}
+		{DW_AT_location {
+		    DW_OP_const1u 12
+		    DW_OP_stack_value
+		} SPECIAL_expr}
+	    }
+	}
+    }
+}
+
+# Build main file.
+if { [build_executable "${testfile}.exp" $binfile \
+	[list ${srcfile} ${main_asm_file}] {nodebug}] } {
+    return
+}
+
+# Build DWO file.
+set dwo_file [standard_output_file ${testfile}.dwo]
+if { [gdb_compile_shlib $dwo_asm_file $dwo_file nodebug] != "" } {
+    return
+}
+
+clean_restart ${testfile}
+
+# This would cause an internal error.
+gdb_test_no_output "maint expand-symtabs"
+
+# Sanity check that the CU was correctly loaded.
+gdb_test "print global_var" " = 12"
+
+# Test again just to see if the symbol can be found without having expanded the
+# symtab first.
+clean_restart ${testfile}
+gdb_test "print global_var" " = 12" "print global_var without symtab expansion"
