Re: Are clang++ and libc++ compatible?

From: Eitan Adler <lists_at_eitanadler.com>
Date: Tue, 12 Nov 2013 13:11:04 -0500
On Tue, Nov 12, 2013 at 11:54 AM, Steve Kargl
<sgk_at_troutmask.apl.washington.edu> wrote:
> On Tue, Nov 12, 2013 at 04:38:17PM +0000, David Chisnall wrote:
>> On 12 Nov 2013, at 16:32, Steve Kargl <sgk_at_troutmask.apl.washington.edu> wrote:
>>
>>> Trying to build news/pan with clang++ dies with
>>>
>>> gmake[3]: Entering directory `/usr/ports/news/pan/work/pan-0.139/pan/general'
>>>  CXX    file-util.o
>>> In file included from file-util.cc:38:
>>> In file included from ./log.h:26:
>>> /usr/include/c++/v1/deque:907:49: error: invalid application of 'sizeof' to an
>>>      incomplete type 'value_type' (aka 'pan::Log::Entry')
>>>    static const difference_type __block_size = sizeof(value_type) < 256 ? 4...
>>>
>>> Anyone know how to fix either clang++ or libc++?
>>
>> The error here does not appear to be in clang or libc++, but in the
>> use by the thing that you are compiling.
>> This is saying that you have tried to create a std::dequeu<pan::Log::Entry>,
>> but pan::Log::Entry is a forward declaration and so the template
>> instantiation fails.
>> The fix is to move the definition of pan::Log::Entry such that it
>> is visible at the time of its use.
>>
>
> I don't know C++, but it is at all like C, then the header files
> are normally placed at the top of a file before one's code.  In
> this case, the code in news/pan/work/pan-0.139/pan/general/log.h
> looks like (where I've striped comment to keep it short)
>
> #ifndef __Log_h__
> #define __Log_h__
>
> #include <ctime>
> #include <set>
> #include <string>
> #include <deque>
>
> namespace pan
> {
>   class Log
>   {
>     public:
>       enum Severity {
>         PAN_SEVERITY_INFO = 1,
>         PAN_SEVERITY_ERROR = 2,
>         PAN_SEVERITY_URGENT = (1<<10)
>       };
>
>       struct Entry {
>         time_t date;
>         Severity severity;
>         std::deque<Entry> messages;
>         std::string message;
>         bool is_child;
>         Entry() : is_child(false) { }
>       };
>
>       void add_entry(Entry& e, std::deque<Entry>& list);
>
>
> Are you saying that I need to move '#include <deque>' to
> the location above the 'void add_entry(...)' line?

The problem here is that the code is trying to make a std::deque of
the type Entry before Entry is fully defined.
This is nearly identical to the problem in the simplified C code below:

struct foo {
struct foo bar;
}



-- 
Eitan Adler
Received on Tue Nov 12 2013 - 17:11:35 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:44 UTC