genode/repos/base/include
Piotr Tworek 80e8cf99e2 base: Make Genode::List clang friendly.
Clang is generally fine with Genode::List and compiles code using it
without emitting any warnings. There is however one exception. Clang
fails hard when building base-hw/src/core/kernel/object.cc.
This is due to a call to Genode::List::remove made from
Object_identity::invalidate function. The error message clang
produces is:

  list.h:96:33: error: 'Genode::List<Kernel::Object_identity_reference>::Element::_next'
  is not a member of class 'const Kernel::Object_identity'
                              _first = le->List::Element::_next;
                                           ~~~~~~~~~~~~~~~^

When we look at the declaration of the Kernel::Object class on which
the remove method is called. as expected it does inherit Genode::List:

using Object_identity_list
	= Genode::List<Kernel::Object_identity>;

class Kernel::Object : private Object_identity_list
{
...
}

Given the error message we see that List::Element should be resolved to
Genode::List<Kernel::Object_identity>::Element, and not
Genode::List<Kernel::Object_identity_reference>::Element. But how does
clang manage to figure out we're talking about Object_identity_refecence
list here? Well, I admit I don't know the exact steps it takes to arrive
at this conclusion, but it is not entirely wrong. If we take a look at
what Kernel::Object_identity is we'll see:

class Kernel::Object_identity
: public Object_identity_list::Element,
  public Kernel::Object_identity_reference_list
{
...
}

Where as one can guess Object_identity_reference_list is defined as:

using Object_identity_reference_list
	= Genode::List<Object_identity_reference>;

Long story short Kernel::Object has Genode::List of both Kernel::Object_identity
and Kernel::Object_identity_reference in its inheritance chain and clang
is not really sure to which of those the code refers to in
Genode::List::remove method by using List::Element::.

The fix for this is relatively simple, explicitly state the full type of
the base class the code intends to refer to. Replacing List::Element,
with List<LT>::Element makes the code buildable with both clang and GCC.

Fixes #3990
2021-01-25 13:58:10 +01:00
..
base Propagate session diag flag to core 2020-12-09 14:02:11 +01:00
cpu Adjust file headers to refer to the AGPLv3 2017-02-28 12:59:29 +01:00
cpu_session Remove Cpu_session::Native_cpu definition from API 2021-01-25 13:58:09 +01:00
cpu_thread base: remove deprecated cancel_blocking() support 2020-07-13 11:33:12 +02:00
dataspace Follow practices suggested by "Effective C++" 2018-01-17 12:14:35 +01:00
deprecated base: remove Cancelable_lock 2020-07-30 08:49:23 +02:00
drivers hw: unify irq enumeration for Raspberri Pi 2020-08-25 11:50:12 +02:00
io_mem_session Annotate io_mem session interface with RAM_QUOTA 2020-05-27 11:56:46 +02:00
io_port_session base/os: remove deprecated APIs 2019-02-26 14:44:15 +01:00
irq_session Annotate irq session interface with RAM_QUOTA 2020-05-27 11:56:46 +02:00
log_session Remove return value of Log_session::write 2020-05-05 13:51:05 +02:00
parent base: mark Parent::Close_result with [[nodiscard]] 2020-01-03 14:44:15 +01:00
pd_session Remove Pd_session::Native_pd definition from API 2021-01-25 12:51:54 +01:00
region_map base/os: remove deprecated APIs 2019-02-26 14:44:15 +01:00
rm_session base/os: remove deprecated APIs 2019-02-26 14:44:15 +01:00
rom_session base/os: remove deprecated APIs 2019-02-26 14:44:15 +01:00
root Replace Genode::strncpy by Genode::copy_cstring 2020-05-27 11:56:45 +02:00
session Streamline exception types 2017-05-31 13:16:07 +02:00
spec vm_session(x86): support cstar register 2020-12-09 14:02:12 +01:00
timer timeout: rework timeout framework 2020-10-09 13:35:56 +02:00
timer_session timeout: rework timeout framework 2020-10-09 13:35:56 +02:00
trace_session trace: extend for_each_subject_infos return value 2020-07-13 11:33:13 +02:00
util base: Make Genode::List clang friendly. 2021-01-25 13:58:10 +01:00
vm_session base: extend vm_session API with native vcpu cap 2020-11-23 12:02:58 +01:00
README Move repositories to 'repos/' subdirectory 2014-05-14 16:08:00 +02:00

This directory contains include files of interfaces that are exported
by components to be used by other components. Each subdirectory corresponds
to the component exporting the interface.