]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/build] Fix build with gcc 9
authorTom de Vries <tdevries@suse.de>
Thu, 20 Mar 2025 10:16:59 +0000 (11:16 +0100)
committerTom de Vries <tdevries@suse.de>
Thu, 20 Mar 2025 10:16:59 +0000 (11:16 +0100)
Since commit a691853148f ("gdb/python: introduce gdbpy_registry"), when
building gdb with gcc 9, I run into:
...
In file included from gdb/varobj.c:38:0:
gdb/python/python-internal.h:1211:47: error: expected ‘;’ before ‘<’ token
   using StorageKey = typename registry<O>::key<Storage>;
                                               ^
...
due to this code:
...
template <typename Storage>
class gdbpy_registry
{
  ...

  template<typename O>
  using StorageKey = typename registry<O>::key<Storage>;

  template<typename O>
  Storage *get_storage (O *owner, const StorageKey<O> &key) const
  { ... }

  ...
}
...

As an experiment, I tried out eliminating the type alias:
...
  template<typename O>
  Storage *get_storage (O *owner,
                        const typename registry<O>::key<Storage> &key) const
  { ... }
...
and got instead:
...
In file included from gdb/varobj.c:38:0:
gdb/python/python-internal.h:1211:63: error: non-template ‘key’ used as template
  Storage *get_storage (O *owner,
                        const typename registry<O>::key<Storage> &key) const
                                                     ^~~
gdb/python/python-internal.h:1211:63: note: use ‘registry<O>::template key’ \
  to indicate that it is a template
...

Following that suggestion, I tried:
...
  template<typename O>
  Storage *
  get_storage (O *owner,
               const typename registry<O>::template key<Storage> &key) const
  { ... }
...
which fixed the problem.

Likewise, adding the template keyword in the type alias fixes the original
problem, so fix it like that.

Tested on x86_64-linux.

gdb/python/python-internal.h

index 5e6707346f9e86ec9753a0c3d5e54499c4a9cdf0..3f1a2067fdb02ba73dd5c05cb5124c5fe2536ae9 100644 (file)
@@ -1208,7 +1208,7 @@ public:
 private:
 
   template<typename O>
-  using StorageKey = typename registry<O>::key<Storage>;
+  using StorageKey = typename registry<O>::template key<Storage>;
 
   template<typename O>
   Storage *get_storage (O *owner, const StorageKey<O> &key) const