Giter Site home page Giter Site logo

standardese's People

Contributors

bresilla avatar brucekangcn avatar brycelelbach avatar cho-m avatar dependabot[bot] avatar eliaskosunen avatar foonathan avatar gitter-badger avatar happyfacade avatar iamveritas avatar jpleau avatar krzmbrzl avatar manu343726 avatar mkurdej avatar morgancaron avatar saraedum avatar tcbrindle avatar tomlankhorst avatar vinniefalco avatar vitaut avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

standardese's Issues

Failure to compile under Alpine Linux with current releases of spdlog and standardese

I am really excited about this tool but have been unable to get it to compile within by build container. I get this error when compiling standardese from current HEAD and latest tag, both when letting the cmake scripts download spdlog and when manually specifying the include directory of the latest spdlog tag.

In file included from /tmp/standardese/src/detail/synopsis_utils.cpp:5:
In file included from /tmp/standardese/include/standardese/detail/synopsis_utils.hpp:10:
In file included from /tmp/standardese/include/standardese/parser.hpp:13:
In file included from /usr/local/include/spdlog/logger.h:15:
In file included from /usr/local/include/spdlog/sinks/base_sink.h:13:
In file included from /usr/local/include/spdlog/sinks/sink.h:9:
In file included from /usr/local/include/spdlog/details/log_msg.h:9:
/usr/local/include/spdlog/details/os.h:354:12: error: no matching conversion for functional-style cast from 'int' to 'std::string' (aka 'basic_string<char>')
    return std::string(strerror_r(err_num, buf, buf_size));
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/6.2.1/../../../../include/c++/6.2.1/bits/basic_string.h:389:7: note: candidate constructor not viable: no known conversion from 'int' to 'const std::allocator<char>' for 1st argument
      basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
      ^

Compiler is clang 3.8.1

Here is the Dockerfile that reproduces the issue: https://raw.githubusercontent.com/qbradq/sosaria-online/1337274c4e8cea387dc276d8ade0db7a20e8abcf/docker/build/Dockerfile

Support for LaTeX in Documentation Comments

Support for LaTeX in documentation comments would be extremely useful for scientific or math-heavy code bases. It doesn't look like CommonMark supports this yet. Doxygen supports LaTeX formulas using the following syntax:

\f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$

Supporting this syntax would be quite useful.

Assertion failure when parsing `__cplusplus` or `_MSC_VER` macros

It happens at least on MSVC 2015u2, Win10.
Assertion at tokenizer.cpp:101 fails:

    assert(buf.is_open());

The reason is however already before, since the line tokenizer.cpp:86:

    clang_getSpellingLocation(begin, &file, nullptr, nullptr, &begin_offset);

doesn't check if file has been modified or is still null (or uninitialized).

cannot document function parameters when functions are in a group

Example code:

/// \group func
/// does something
/// \param a first
/// \param b second
void func(int a, int b);

/// \group func
void func(int a);

The documented output becomes:

Header file t.h

void func(int a, int b);

void func(int a);

Function func

(1)    void func(int a, int b);

(2)    void func(int a);

does something

Output from standardese run with --verbose=1 is:

[debug] Using libclang version: clang version 3.9.1-svn281634-1~exp1 (branches/release_39)
[debug] Using cmark version: 0.25.2
[info] Generating documentation for "/tmp/t.h"...
[debug] parsing entity 'func(int, int)' (/tmp/t.h:5) of type 'FunctionDecl'
[debug] parsing entity 'func(int)' (/tmp/t.h:8) of type 'FunctionDecl'
[info] Generating indices...
[info] Writing files for output format md...
[debug] writing documentation file 't'
[debug] writing documentation file 'standardese_entities'

For templates, the template parameters can be \excluded per part in the group, but not otherwise documented.

Documenting the parameters of each variant in a group is useful. See e.g. any_of on cppreference.com

cldoc?

Hello, may I kindly ask whether you are aware of jessevdk/cldoc? And if yes, then what's the point of yet another effort compared to the linked one?

tokenizer::read_source() assertion failed

Core dump:

standardese: /home/manu343726/Documentos/siplasplas/build/THIRDPARTY/standardese/src/standardese/src/detail/tokenizer.cpp:205: static std::string standardese::detail::tokenizer::read_source(standardese::translation_unit &, standardese::cpp_cursor): Assertion `clang_File_isEqual(file, tu.get_cxfile())' failed.

The input are the header files here. (standardese command generated from here), assertion failed when parsing exception.hpp.

Compiling on Fedora linux

Running cmake on Fedora 25 using standard system clang packages gives an error:

...
CMake Error at external/external.cmake:56 (message):
  3.7.1 unable to find clang's system header files, please set
  LIBCLANG_SYSTEM_INCLUDE_DIR yourself
Call Stack (most recent call first):
  CMakeLists.txt:16 (include)

I fixed the error by adding the path /usr/lib64 to CLANG_LIBRARY_PATHS variable in external/external.cmake

Lists on tparam not rendering correctly

  /*! Provides the result of a success, a success with additional information, or a failure.
  \group result
  \tparam R The type of the successful result.
  \tparam EC The type of the failure/info result.
  \requires Must be DefaultConstructible and BooleanTestable e.g. `if(ec)`
  \tparam NoValuePolicy Policy on how to interpret type `EC` when a wide observation of a not present value occurs.
  Default is:
  - If C++ exceptions are enabled:
      - If `EC` convertible to a `std::error_code`, `throw std::system_error(error())`.
      - If `EC` convertible to a `std::exception_ptr`, `std::rethrow_exception(error())`.
      - If `EC` is `void`, call `std::terminate()`.
      - Else `throw error()`.
  - If C++ exceptions are not enabled, call `std::terminate()`.
  */
  template <class R, class EC = error_code_extended, class NoValuePolicy = policy::default_result_policy<EC>> class result : public result_base<result<R, EC, NoValuePolicy>, R, EC, NoValuePolicy>

What I would expect is that an indented bullet list appears on the tparam NoValuePolicy. It does not.

Also, there is no Requires section on the tparam EC.

Issues with --input.blacklist_dir

Running standardese with --input.blacklist_file x86intrin.h --input.blacklist_dir compiler ../../inc/ gives me the following error:
[critical] when parsing '' (/home/cabox/workspace/inc/compiler/push:11): ill formed preprocessor directive (Boost.Wave)

However according to the help it should ignore anything beyond 'compiler', right?

Sane defaults for boilerplate functions

The sample output contains this class:

template <typename RawAllocator>
class direct_storage
{
public:
    direct_storage<RawAllocator>() = default;
    direct_storage<RawAllocator>(direct_storage && other) noexcept;
    direct_storage & operator=(direct_storage && other) noexcept;
    allocator_type & get_allocator() noexcept;

protected:
    ~direct_storage<RawAllocator>() noexcept = default;
};

Which is almost entirely standard boilerplate, most of it defaulted.

I haven't been able to find the source that generated the sample output, it looks a lot like the following. For the default instructor:

Effects: Creates it by default-constructing the allocator.

Requires: The RawAllcoator must be default constructible.

For the move constructor:

Effects: Moves the direct_storage object. This will move the stored allocator.

For the move assignment:

Effects: Moves the direct_storage object. This will move the stored allocator.

All of these documentation examples are pretty much standard descriptions for those operations. It's good to have these functions documented, but it would be tedious to write "copies foo object" or "moves foo object" or "default constructs foo object" for what the compiler can plainly see is a copy op, move op, or default construct op.

How about a way to generate "default documentation" for standard functions, that works pretty much the same way as "= default" does?

For example:

template <typename RawAllocator>
class direct_storage
{
public:
    /// \defaultdoc
    /// \requires The `RawAllocator` must be default constructible.
    direct_storage<RawAllocator>() = default;

    /// \defaultdoc
    direct_storage<RawAllocator>(direct_storage && other) noexcept;

    /// \defaultdoc
    direct_storage & operator=(direct_storage && other) noexcept;

    /// \defaultdoc    <-- ERROR: No default doc for this function signature.
    ///                           You'd have to provide manual docs for it.
    allocator_type & get_allocator() noexcept;
};

To generate almost exactly the same output as in the sample. (Obviously without the comments about default constructing or moving the allocator. Though if you can add extra text after the \defaultdoc, you can add those comments, I suppose.)

Sane defaults - possibly configurable ones - can be provided for all special member functions that can be defaulted, along with things like operator==, operator+, and most other operators, and functions with more-or-less standardized names like swap, begin/end, and so on. These are functions where actually spelling out what they do in the comments seems almost tortuously unnecessary (things like "compares two foo objects" or "converts a foo object to a bar") - where 80% of the time the default basic description is fine, and 19% of the time it's good but for a few additional details you want to add (and for that 1% of the time where it won't work at all, you're free to provide your own text and not use the default). Basically any function with a signature that is de facto standardized can have default documentation.

Bikeshedding

Rather than defaultdoc, a better name might be something like standard-semantics, so the comment documents that the function follows the standard semantics for that type of function. That's actually useful information:

/// \standard-semantics
bool operator==(foo const&, foo const&);

/// \standard-semantics
/// The `bar` member is compared first, then the `baz` member.
bool operator<(foo const&, foo const&);

Unused dynamic_cast return value warnings with Clang

Clang issues warnings if the result of dynamic_cast is unused. This is done in 23 places in the tests, the full list as follows:

[32/37] Building CXX object test/CMakeFiles/standardese_test.dir/cpp_type.cpp.o
../test/cpp_type.cpp:306:21: warning: expression result unused [-Wunused-value]
                    dynamic_cast<const cpp_class&>(member);
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
[33/37] Building CXX object test/CMakeFiles/standardese_test.dir/cpp_template.cpp.o
../test/cpp_template.cpp:236:33: warning: expression result unused [-Wunused-value]
                REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(e));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:254:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
]
../test/cpp_template.cpp:260:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_non_type_template_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:282:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:288:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_non_type_template_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:307:33: warning: expression result unused [-Wunused-value]
                REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(e));
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:323:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:329:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_non_type_template_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:349:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(e));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:358:37: warning: expression result unused [-Wunused-value]
                    REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(*te.begin()));
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:422:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:443:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_non_type_template_parameter&>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:449:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:488:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_member_function&>(ptr->get_function()));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:498:49: warning: expression result unused [-Wunused-value]
                                REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(param));
                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:509:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_constructor&>(ptr->get_function()));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:518:49: warning: expression result unused [-Wunused-value]
                                REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(param));
                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:529:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_conversion_op&>(ptr->get_function()));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:538:49: warning: expression result unused [-Wunused-value]
                                REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter&>(param));
                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:627:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:647:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_non_type_template_parameter &>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

../test/cpp_template.cpp:653:41: warning: expression result unused [-Wunused-value]
                        REQUIRE_NOTHROW(dynamic_cast<const cpp_template_type_parameter &>(param));
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(Extra Clang output from Catch macro expansions suppressed.)

One possible solution would be to say

REQUIRE(dynamic_cast<T*>(&u) != nullptr)

in these places instead.

Cannot build on Mac OS with Clang

Attempting to build with Clang/libc++ on Mac OS gives the error:

/Users/tristan/Coding/standardese/include/standardese/string.hpp:130:72: error: no member named '~string' in 'std::__1::basic_string<char>'
                static_cast<std::string*>(get_storage())->std::string::~string();

I can't say I understand this as there clearly is a destructor defined for std::string, but there we are. The same code compiles without warning using GCC 6.1/libstdc++.

If you need any more info please let me know.

Preprocessing #error

Hello,

The following fails to compile with the latest release (v0.2-2) and the latest develop (#5e03c95)

#if __cplusplus <= 201103
#error "Should not appear for C++11 & C++14"
#endif

The error is :

[critical] when parsing '<unknown>' (test.cpp:2): encountered #error directive or #pragma wave stop() (Boost.Wave)

Support deleted free functions

Due to libclang limitations there is currently no support for deleted free functions they are considered not-deleted.

The = delete does not seem to show up in the tokens, so I'd most likely need to work around that with a special comment for this version.

Example/code tag

Some basic usage examples are often really useful for documenting code. How about introducing a code or example tag in standardese? They could be different to doxygen but at the moment there is no way to conveniently provide code examples for functions or classes (please correct me if I'm wrong).

Otherwise using standardese to document code is way cleaner and easier than doxygen, thank you 👍

segmentation fault when using exceptions

When using try-catch block inside some scope (like a member function in a class) it works, but if not it gives a segmentation fault.

For example

template<typename T>
void foo(T& myarg) try {
} catch(int whatever) {
}

The backtrace:
bt.txt

'hidden' doesn't work depending on the order of parsing

Consider the following case:

  • File library/bar.hpp:
/// \exclude
struct Bar {};
  • File library/foo.hpp:
#include "library/bar.hpp"
/// Struct documentation
struct Foo
{
  Bar bar();
};

If you run standardese --verbose -j 2 -I . library, it outputs:

[debug] Using libclang version: clang version 3.9.1 (tags/RELEASE_391/final)
[debug] Using cmark version: 0.27.0
[info] Generating documentation for "library/foo.hpp"...
[info] Generating documentation for "library/bar.hpp"...
[debug] parsing entity 'Bar' (library/bar.hpp:2) of type 'StructDecl'
[debug] parsing entity 'Foo' (library/foo.hpp:4) of type 'StructDecl'
[debug] parsing entity 'bar()' (library/foo.hpp:7) of type 'CXXMethod'
[info] Generating indices...
[info] Writing files for output format md...
[debug] writing documentation file 'doc_foo'
[debug] writing documentation file 'doc_bar'
[debug] writing documentation file 'standardese_files'
[debug] writing documentation file 'standardese_entities'

and the contents of doc_foo is:

# Header file `foo.hpp`<a id="foo.hpp"></a>

<pre><code class="language-cpp">struct <a href='doc_foo.md#Foo'>Foo</a>;</code></pre>

## Struct `Foo`<a id="Foo"></a>

<pre><code class="language-cpp">struct Foo
{
    'hidden' <a href='doc_foo.md#Foo'>bar</a>();
};</code></pre>

Struct documentation

However, if you run standardese --verbose -j 1 -I . library, it outputs:

[debug] Using libclang version: clang version 3.9.1 (tags/RELEASE_391/final)
[debug] Using cmark version: 0.27.0
[info] Generating documentation for "library/foo.hpp"...
[debug] parsing entity 'Foo' (library/foo.hpp:3) of type 'StructDecl'
[debug] parsing entity 'bar()' (library/foo.hpp:5) of type 'CXXMethod'
[info] Generating documentation for "library/bar.hpp"...
[debug] parsing entity 'Bar' (library/bar.hpp:2) of type 'StructDecl'
[info] Generating indices...
[info] Writing files for output format md...
[debug] writing documentation file 'doc_foo'
[debug] writing documentation file 'doc_bar'
[debug] writing documentation file 'standardese_files'
[debug] writing documentation file 'standardese_entities'

and the return of bar() is not hidden anymore:

# Header file `foo.hpp`<a id="foo.hpp"></a>

<pre><code class="language-cpp">struct <a href='doc_foo.md#Foo'>Foo</a>;</code></pre>

## Struct `Foo`<a id="Foo"></a>

<pre><code class="language-cpp">struct Foo
{
    Bar <a href='doc_foo.md#Foo'>bar</a>();
};</code></pre>

Struct documentation

Generate entties through macro

If you have a macro that generates multiple entities, e.g. something like this:

#define FOO(Name) \
struct Name \
{ \
  Name(); \
};

FOO(bar)

libclang does not give the correct source code for each entity instead the entire code generated by the macro for each.
Because of that I can't parse such generated entties properly, standardese will issue an error and continues with the next entities.

Support for Concepts TS (not merely documented concepts)

[I didn't want to piggyback on the other issue because this is about actual concepts, not just doc]

We are currently writing a library that uses actual concepts (as in the TS) and I was wondering if standardese handles them any better than regular doxygen?
Doxygen makes regular templatized variables of the concept definitions (which is not nice, but ok) and it puts all of the requires clause into the return type of a constrained functions (which makes the documentation horrible to read).
Does standardese work any better or is it limited by libclang's inability to parse Concepts TS right now?

Thanks!

Cannot \exclude template parameter if preceded by parameter pack

Example code:

#include <utility>

/// makes a T from n parameters
/// \param T target type
/// \param 2
/// \exclude
template <typename T, typename ... U, typename = std::enable_if_t<std::is_constructible<T, U...>{}>>
T make_t_m(U&& ...u);

/// makes a T from a parameter
/// \param T target type
/// \param 2
/// \exclude
template <typename T, typename U, typename = std::enable_if_t<std::is_constructible<T, U>{}>>
T make_t(U&& u);

The generated documentation does not \exclude the SFINAE typename for make_t_m(), but does so for make_t().

No error-indicating output when run with --verbose=1.

Prebuilt binaries should use 100% static libraries

Right now there is at least a dependency on libclang.dll. That sucks. I'd like the prebuilt binaries to be 100% free of all shared library dependencies. 100% statically linked.

And ideally auto regenerated per commit by CI so my other CI jobs can go fetch "latest standardese executable" and rebuild my docs.

`assert` failure when combining comparison with template parameters

When the following source file is passed to the standardese command

#include <type_traits>

template<int Exponent, typename std::enable_if<!(Exponent<=0) && (Exponent<8), int>::type Dummy = 0>
constexpr int pow2()
{
    return pow2<int, Exponent-1>()*2;
}

the program crashes with the following output

[info] Generating documentation for "fixed_point.h"...
standardese: /home/john/github/foonathan/standardese/src/detail/parse_utils.cpp:57: void standardese::detail::unmunch(std::__cxx11::string&): Assertion `balance == 0 || balance == -1' failed.

and balance set to 2.

It appears that the comparison operator < is being incorrectly parsed as the open brace to a template parameter list. The excerpt is part of this header file.

Error when parsing anonymous enumeration

When parsing an anonymous enumeration in a structure such as

struct Foo {
    enum {bar = 0};
};

I get the following error:

[error] when parsing '' (file:line): expected '' got '{'

The error disappears if the enumeration is given a name.

Multiple \modules per entity?

Would it be possible to have \ingroup and \defgroup commands that are compatible with Doxygen in addition to the current \group command? This will make the transition from Doxygen to Standardese easier.

Clicking on Namespace Name Doesn't Show Namespace

When clicking on a namespace one is redirected to the first file (alphabetically, I think) that contains that namespace rather than a page that contains a list of all the entities in a particular namespace.

e.g. with brigand, clicking on the "lazy" namespace redirects to the documentation for types/inherit_linearly.hpp rather than a list of all the entities in the namespace.

Handle attributes when parsing spelling

When parsing classes with export/import attributes (For Windows DLLs) Standardese fails to parse the class spelling. Here's Standardese invocation on siplasplas allocator library headers, which classes have export macros generated by cmake.

In the example output, the macros were generated for GCC on Linux, so the macro instantiations are __attribute__((visibility("default"))) and __attribute__((visibility("hidden")))

double free error

I got this error today:

** Error in `standardese': double free or corruption (fasttop): 0x00007f1d74001270 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f1daff977e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f1daffa037a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f1daffa453c]
/usr/lib/x86_64-linux-gnu/libclang-4.0.so.1(+0x2a509d)[0x7f1db0f7509d]
/usr/lib/x86_64-linux-gnu/libclang-4.0.so.1(+0x28c92f)[0x7f1db0f5c92f]
/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1(_ZN4llvm20CrashRecoveryContext9RunSafelyENS_12function_refIFvvEEE+0x99)[0x7f1dad45ba99]
/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1(+0x69bb04)[0x7f1dad45bb04]
/usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1(+0x70fd0d)[0x7f1dad4cfd0d]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7f1db23e76ba]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f1db00273dd]
======= Memory map: ========
00400000-005a4000 r-x- 00000000 00:00 384872                     /usr/local/bin/standardese
007a4000-007ad000 r--- 001a4000 00:00 384872                     /usr/local/bin/standardese
007ad000-007ae000 rw-- 001ad000 00:00 384872                     /usr/local/bin/standardese
007ae000-007b3000 rw-- 00000000 00:00 0
00c88000-00cfc000 rw-- 00000000 00:00 0                          [heap]
7f1d5c000000-7f1d5c041000 rw-- 00000000 00:00 0
7f1d5c041000-7f1d60000000 ---- 00000000 00:00 0
7f1d64000000-7f1d64041000 rw-- 00000000 00:00 0
7f1d64041000-7f1d68000000 ---- 00000000 00:00 0
7f1d6c000000-7f1d6c041000 rw-- 00000000 00:00 0
7f1d6c041000-7f1d70000000 ---- 00000000 00:00 0
7f1d74000000-7f1d74041000 rw-- 00000000 00:00 0
7f1d74041000-7f1d78000000 ---- 00000000 00:00 0
7f1d7c000000-7f1d7c041000 rw-- 00000000 00:00 0
7f1d7c041000-7f1d80000000 ---- 00000000 00:00 0
7f1d84000000-7f1d84041000 rw-- 00000000 00:00 0
7f1d84041000-7f1d88000000 ---- 00000000 00:00 0
7f1d8c000000-7f1d8c021000 rw-- 00000000 00:00 0
7f1d8c021000-7f1d90000000 ---- 00000000 00:00 0
7f1d90000000-7f1d90041000 rw-- 00000000 00:00 0
7f1d90041000-7f1d94000000 ---- 00000000 00:00 0
7f1d94000000-7f1d94021000 rw-- 00000000 00:00 0
7f1d94021000-7f1d98000000 ---- 00000000 00:00 0
7f1d99fc0000-7f1d99fc1000 ---- 00000000 00:00 0
7f1d99fc1000-7f1d9a7c1000 rw-- 00000000 00:00 0
7f1d9c000000-7f1d9c021000 rw-- 00000000 00:00 0
7f1d9c021000-7f1da0000000 ---- 00000000 00:00 0
7f1da0000000-7f1da0041000 rw-- 00000000 00:00 0
7f1da0041000-7f1da4000000 ---- 00000000 00:00 0
7f1da4000000-7f1da4021000 rw-- 00000000 00:00 0
7f1da4021000-7f1da8000000 ---- 00000000 00:00 0
7f1da8780000-7f1da8781000 ---- 00000000 00:00 0
7f1da8781000-7f1da8f81000 rw-- 00000000 00:00 0
7f1da8f90000-7f1da8f91000 ---- 00000000 00:00 0
7f1da8f91000-7f1da9791000 rw-- 00000000 00:00 0
7f1da97a0000-7f1da97a1000 ---- 00000000 00:00 0
7f1da97a1000-7f1da9fa1000 rw-- 00000000 00:00 0
7f1da9fb0000-7f1da9fb1000 ---- 00000000 00:00 0
7f1da9fb1000-7f1daa7b1000 rw-- 00000000 00:00 0
7f1daa7c0000-7f1daa7c1000 ---- 00000000 00:00 0
7f1daa7c1000-7f1daafc1000 rw-- 00000000 00:00 0
7f1daafd0000-7f1daafd1000 ---- 00000000 00:00 0
7f1daafd1000-7f1dab7d1000 rw-- 00000000 00:00 0
7f1dab7e0000-7f1dab7e1000 ---- 00000000 00:00 0
7f1dab7e1000-7f1dabfe1000 rw-- 00000000 00:00 0
7f1dabff0000-7f1dac003000 r-x- 00000000 00:00 172342             /lib/x86_64-linux-gnu/libbsd.so.0.8.2
7f1dac003000-7f1dac004000 ---- 00013000 00:00 172342             /lib/x86_64-linux-gnu/libbsd.so.0.8.2
7f1dac004000-7f1dac202000 ---- 00000000 00:00 0
7f1dac202000-7f1dac203000 r--- 00012000 00:00 172342             /lib/x86_64-linux-gnu/libbsd.so.0.8.2
7f1dac203000-7f1dac204000 rw-- 00013000 00:00 172342             /lib/x86_64-linux-gnu/libbsd.so.0.8.2
7f1dac204000-7f1dac205000 rw-- 00000000 00:00 0
7f1dac210000-7f1dac229000 r-x- 00000000 00:00 180855             /lib/x86_64-linux-gnu/libz.so.1.2.8
7f1dac229000-7f1dac22a000 ---- 00019000 00:00 180855             /lib/x86_64-linux-gnu/libz.so.1.2.8
7f1dac22a000-7f1dac428000 ---- 00000000 00:00 0
7f1dac428000-7f1dac429000 r--- 00018000 00:00 180855             /lib/x86_64-linux-gnu/libz.so.1.2.8
7f1dac429000-7f1dac42a000 rw-- 00019000 00:00 180855             /lib/x86_64-linux-gnu/libz.so.1.2.8
7f1dac430000-7f1dac455000 r-x- 00000000 00:00 172203             /lib/x86_64-linux-gnu/libtinfo.so.5.9
7f1dac455000-7f1dac459000 ---- 00025000 00:00 172203             /lib/x86_64-linux-gnu/libtinfo.so.5.9
7f1dac459000-7f1dac654000 ---- 00000000 00:00 0
7f1dac654000-7f1dac658000 r--- 00024000 00:00 172203             /lib/x86_64-linux-gnu/libtinfo.so.5.9
7f1dac658000-7f1dac659000 rw-- 00028000 00:00 172203             /lib/x86_64-linux-gnu/libtinfo.so.5.9
7f1dac660000-7f1dac691000 r-x- 00000000 00:00 275591             /usr/lib/x86_64-linux-gnu/libedit.so.2.0.53
7f1dac691000-7f1dac694000 ---- 00031000 00:00 275591             /usr/lib/x86_64-linux-gnu/libedit.so.2.0.53
7f1dac694000-7f1dac891000 ---- 00000000 00:00 0
7f1dac891000-7f1dac893000 r--- 00031000 00:00 275591             /usr/lib/x86_64-linux-gnu/libedit.so.2.0.53
7f1dac893000-7f1dac894000 rw-- 00033000 00:00 275591             /usr/lib/x86_64-linux-gnu/libedit.so.2.0.53
7f1dac894000-7f1dac898000 rw-- 00000000 00:00 0
7f1dac8a0000-7f1dac8a7000 r-x- 00000000 00:00 275982             /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7f1dac8a7000-7f1dac8a8000 ---- 00007000 00:00 275982             /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7f1dac8a8000-7f1dacaa6000 ---- 00000000 00:00 0
7f1dacaa6000-7f1dacaa7000 r--- 00006000 00:00 275982             /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7f1dacaa7000-7f1dacaa8000 rw-- 00007000 00:00 275982             /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7f1dacab0000-7f1dacbb8000 r-x- 00000000 00:00 285567             /lib/x86_64-linux-gnu/libm-2.23.so
7f1dacbb8000-7f1dacbba000 ---- 00108000 00:00 285567             /lib/x86_64-linux-gnu/libm-2.23.so
7f1dacbba000-7f1dacdb7000 ---- 00000000 00:00 0
7f1dacdb7000-7f1dacdb8000 r--- 00107000 00:00 285567             /lib/x86_64-linux-gnu/libm-2.23.so
7f1dacdb8000-7f1dacdb9000 rw-- 00108000 00:00 285567             /lib/x86_64-linux-gnu/libm-2.23.so
7f1dacdc0000-7f1daf99e000 r-x- 00000000 00:00 287606             /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1
7f1daf99e000-7f1daf99f000 ---- 02bde000 00:00 287606             /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1
7f1daf99f000-7f1dafcb3000 r--- 02bde000 00:00 287606             /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1
7f1dafcb3000-7f1dafcb8000 rw-- 02ef2000 00:00 287606             /usr/lib/x86_64-linux-gnu/libLLVM-4.0.so.1
7f1dafcb8000-7f1dafd07000 rw-- 00000000 00:00 0
7f1dafd10000-7f1dafd13000 r-x- 00000000 00:00 285557             /lib/x86_64-linux-gnu/libdl-2.23.so
7f1dafd13000-7f1dafd14000 ---- 00003000 00:00 285557             /lib/x86_64-linux-gnu/libdl-2.23.so
7f1dafd14000-7f1daff12000 ---- 00000000 00:00 0
7f1daff12000-7f1daff13000 r--- 00002000 00:00 285557             /lib/x86_64-linux-gnu/libdl-2.23.so
7f1daff13000-7f1daff14000 rw-- 00003000 00:00 285557             /lib/x86_64-linux-gnu/libdl-2.23.so
7f1daff20000-7f1db00e0000 r-x- 00000000 00:00 285580             /lib/x86_64-linux-gnu/libc-2.23.so
7f1db00e0000-7f1db00e9000 ---- 001c0000 00:00 285580             /lib/x86_64-linux-gnu/libc-2.23.so
7f1db00e9000-7f1db02e0000 ---- 00000000 00:00 0
7f1db02e0000-7f1db02e4000 r--- 001c0000 00:00 285580             /lib/x86_64-linux-gnu/libc-2.23.so
7f1db02e4000-7f1db02e6000 rw-- 001c4000 00:00 285580             /lib/x86_64-linux-gnu/libc-2.23.so
7f1db02e6000-7f1db02ea000 rw-- 00000000 00:00 0
7f1db02f0000-7f1db0306000 r-x- 00000000 00:00 172187             /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1db0306000-7f1db0505000 ---- 00000000 00:00 0
7f1db0505000-7f1db0506000 rw-- 00015000 00:00 172187             /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1db0510000-7f1db0682000 r-x- 00000000 00:00 287046             /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1db0682000-7f1db068f000 ---- 00172000 00:00 287046             /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1db068f000-7f1db0882000 ---- 00000000 00:00 0
7f1db0882000-7f1db088c000 r--- 00172000 00:00 287046             /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1db088c000-7f1db088e000 rw-- 0017c000 00:00 287046             /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1db088e000-7f1db0892000 rw-- 00000000 00:00 0
7f1db08a0000-7f1db08a3000 r-x- 00000000 00:00 162071             /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7f1db08a3000-7f1db08a4000 ---- 00003000 00:00 162071             /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7f1db08a4000-7f1db0aa2000 ---- 00000000 00:00 0
7f1db0aa2000-7f1db0aa3000 r--- 00002000 00:00 162071             /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7f1db0aa3000-7f1db0aa4000 rw-- 00003000 00:00 162071             /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7f1db0ab0000-7f1db0ac7000 r-x- 00000000 00:00 167781             /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0
7f1db0ac7000-7f1db0ac8000 ---- 00017000 00:00 167781             /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0
7f1db0ac8000-7f1db0cc6000 ---- 00000000 00:00 0
7f1db0cc6000-7f1db0cc7000 r--- 00016000 00:00 167781             /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0
7f1db0cc7000-7f1db0cc8000 rw-- 00017000 00:00 167781             /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0
7f1db0cd0000-7f1db2301000 r-x- 00000000 00:00 287641             /usr/lib/x86_64-linux-gnu/libclang-4.0.so.1
7f1db2301000-7f1db23d3000 r--- 01630000 00:00 287641             /usr/lib/x86_64-linux-gnu/libclang-4.0.so.1
7f1db23d3000-7f1db23d5000 rw-- 01702000 00:00 287641             /usr/lib/x86_64-linux-gnu/libclang-4.0.so.1
7f1db23d5000-7f1db23d9000 rw-- 00000000 00:00 0
7f1db23e0000-7f1db23f8000 r-x- 00000000 00:00 285545             /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1db23f8000-7f1db2402000 ---- 00018000 00:00 285545             /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1db2402000-7f1db25f7000 ---- 00000000 00:00 0
7f1db25f7000-7f1db25f8000 r--- 00017000 00:00 285545             /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1db25f8000-7f1db25f9000 rw-- 00018000 00:00 285545             /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1db25f9000-7f1db25fd000 rw-- 00000000 00:00 0
7f1db2600000-7f1db2626000 r-x- 00000000 00:00 285536             /lib/x86_64-linux-gnu/ld-2.23.so
7f1db2710000-7f1db2731000 rw-- 00000000 00:00 0
7f1db2740000-7f1db2761000 rw-- 00000000 00:00 0
7f1db2770000-7f1db2772000 rw-- 00000000 00:00 0
7f1db2780000-7f1db2781000 rw-- 00000000 00:00 0
7f1db2790000-7f1db2792000 rw-- 00000000 00:00 0
7f1db27a0000-7f1db27a1000 rw-- 00000000 00:00 0
7f1db27b0000-7f1db27b1000 rw-- 00000000 00:00 0
7f1db27c0000-7f1db27c1000 rw-- 00000000 00:00 0
7f1db27d0000-7f1db27d1000 rw-- 00000000 00:00 0
7f1db27e0000-7f1db27e1000 rw-- 00000000 00:00 0
7f1db27f0000-7f1db27f1000 rw-- 00000000 00:00 0
7f1db2800000-7f1db2801000 rw-- 00000000 00:00 0
7f1db2810000-7f1db2811000 rw-- 00000000 00:00 0
7f1db2820000-7f1db2821000 rw-- 00000000 00:00 0
7f1db2825000-7f1db2826000 r--- 00025000 00:00 285536             /lib/x86_64-linux-gnu/ld-2.23.so
7f1db2826000-7f1db2827000 rw-- 00026000 00:00 285536             /lib/x86_64-linux-gnu/ld-2.23.so
7f1db2827000-7f1db2828000 rw-- 00000000 00:00 0
7f1db2830000-7f1db2832000 rw-- 00000000 00:00 0
7fffe3117000-7fffe3917000 rw-- 00000000 00:00 0                  [stack]
7fffe39d6000-7fffe39d7000 r-x- 00000000 00:00 0                  [vdso]

running again worked fine

standardese version 0.3
Copyright (C) 2016 Jonathan Müller <[email protected]>

Using libclang version: clang version 4.0.0-1ubuntu1~16.04.2 (tags/RELEASE_400/rc1)
Using cmark version: 0.25.2

system is the linux subsystem on windows (ubuntu 16.04)

A friend function inside a class raises a warning and is not documented

A friend declaration raises the following warning:

[warning] when parsing '' (file:line): Unknown cursor kind 'UnexposedDecl'

If the definition is inline, the function's documentation is not extracted.

Example:

/** A test class */
struct Test {
    /** A sample friend function */
    friend void foo();
};

Add clang and OS X to travis CI

It would be nice to have continuous integration with all major compilers (clang is missing) and major platforms (OS X is missing).

Make develop the default branch

The pull request template says to make all pull requests against the develop branch, but the default branch is set to master

boost wave exception

When runing standardese on my project I found that when using the preprocessor inside a struct inside a class it throws an exception.

Commenting the preprocessor conditionals or one of the class it doesn't throw.

class Foo {
  struct Bar {
    #ifdef A
    #elif B
    #else
    #warning C
    #endif
  }mybar;
};

$ standardese test.h

[info] Generating documentation for "test.h"...
terminate called after throwing an instance of 'boost::exception_detail::clone_implboost::exception_detail::error_info_injector<boost::wave::preprocess_exception >'
what(): boost::wave::preprocess_exception
zsh: abort standardese test.h

Link/Emphasis within param documentation fires assert

Putting a link within a function parameter documentation comment triggers an assertion.

Standardese version from git, commit 0fe0e66.
Platform: Arch Linux x64

Minimal source code:

/// \param foo [std::vector]()
void bar(int foo);

Output of standardese --verbose:

[debug] Using libclang version: clang version 3.8.1 (tags/RELEASE_381/final)
[debug] Using cmark version: 0.26.1
[info] Generating documentation for "temp.hpp"...
standardese: /home/simon/aur/standardese-git/src/standardese/src/comment.cpp:556: void {anonymous}::container_stack::pop(): Assertion `!stack_.empty()' failed.
[1] 20106 abort (core dumped) standardese --verbose temp.hpp

(Better) distinguish between new and overriden functions

The virtual flags make a distinction between cpp_virtual_new and cpp_virtual_overriden.
Currently only member functions marked with override become cpp_virtual_overriden.
This should be changed to lookup functions in the base class and determine whether they are actually overriding something to support pre-C++11 virtuals.

Documentation for Compiling with LLVM from brew on Mac

I think adding a section for compiling with LLVM that is installed via brew on Macs could be helpful. Here is the CMake command I had to use for LLVM 3.9.0

cmake -DSTANDARDESE_BUILD_TEST=OFF -DLIBCLANG_INCLUDE_DIR=/usr/local/opt/llvm/include -DLIBCLANG_LIBRARY=/usr/local/opt/llvm/lib/libclang.dylib -DLIBCLANG_SYSTEM_INCLUDE_DIR=/usr/local/opt/llvm/lib/clang/3.9.0/include ..

The version of LLVM only shows up in the LIBCLANG_SYSTEM_INCLUDE_DIR and from my tests can even be replaced by a wildcard, so

cmake -DSTANDARDESE_BUILD_TEST=OFF -DLIBCLANG_INCLUDE_DIR=/usr/local/opt/llvm/include -DLIBCLANG_LIBRARY=/usr/local/opt/llvm/lib/libclang.dylib -DLIBCLANG_SYSTEM_INCLUDE_DIR=/usr/local/opt/llvm/lib/clang/*/include ..

seems to also work correctly.

Support for variable template

Due to libclang 3.7 limitations there is no support for variable or alias templates.
Variable templates become normal variables and alias templates are simply ignored.

Before a libclang version gets available try to work around that somehow.

Segfault in test

The cpp_using_declaration test segfaults on MacOS:

standardese_test is a Catch v1.5.5 host application.
Run with -? for options

-------------------------------------------------------------------------------
cpp_using_declaration
-------------------------------------------------------------------------------
../test/cpp_namespace.cpp:296
...............................................................................

../test/cpp_namespace.cpp:296: FAILED:
  {Unknown expression after the reported line}
due to a fatal error condition:

  SIGSEGV - Segmentation violation signal

===============================================================================
test cases:  11 |  10 passed | 1 failed
assertions: 359 | 358 passed | 1 failed

Debug build dies on assert src/cpp_template.cpp:281

cpp_template.cpp:281 assert(source[last_offset] == '>');

last_offset == 41
source == "template <typename T, typename = decltype(std::declval<T>() == nullptr)>\n operator T&&() const;"

This is from running standardese -v 1 ~/develop/trompeloeil/trompeloeil.hpp (ac64f398204ad4e041aea46ecbdb93a57d7215b9 on branch develop)

Build is from standardese a48db3b on branch develop

Backtrace:

#0  0x00007ffb57ecf418 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffb57ecf418 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffb57ed101a in __GI_abort () at abort.c:89
#2  0x00007ffb57ec7bd7 in __assert_fail_base (fmt=<optimised out>, 
    assertion=assertion@entry=0x9039cc "source[last_offset] == '>'", 
    file=file@entry=0x903858 "/home/bf/devel/standardese/src/cpp_template.cpp", line=line@entry=281, 
    function=function@entry=0x90cf80 <(anonymous namespace)::get_template_offset(standardese::translation_unit&, standardese::cpp_cursor, unsigned int)::__PRETTY_FUNCTION__> "unsigned int {anonymous}::get_template_offset(standardese::translation_unit&, standardese::cpp_cursor, unsigned int)") at assert.c:92
#3  0x00007ffb57ec7c82 in __GI___assert_fail (assertion=0x9039cc "source[last_offset] == '>'", 
    file=0x903858 "/home/bf/devel/standardese/src/cpp_template.cpp", line=281, 
    function=0x90cf80 <(anonymous namespace)::get_template_offset(standardese::translation_unit&, standardese::cpp_cursor, unsigned int)::__PRETTY_FUNCTION__> "unsigned int {anonymous}::get_template_offset(standardese::translation_unit&, standardese::cpp_cursor, unsigned int)") at assert.c:101
#4  0x00000000008379bf in (anonymous namespace)::get_template_offset (tu=..., cur=..., last_offset=41)
    at /home/bf/devel/standardese/src/cpp_template.cpp:281
#5  0x0000000000837a90 in standardese::cpp_function_template::parse (tu=..., cur=..., parent=...)
    at /home/bf/devel/standardese/src/cpp_template.cpp:295
#6  0x000000000081ed51 in standardese::cpp_entity::try_parse (tu=..., cur=..., parent=...)
    at /home/bf/devel/standardese/src/cpp_entity.cpp:68
#7  0x00000000007c362e in standardese::translation_unit::translation_unit(standardese::parser const&, char const*, standardese::cpp_file*, standardese::compile_config const&)::{lambda(standardese::cpp_cursor, standardese::cpp_cursor)#1}::operator()(standardese::cpp_cursor, standardese::cpp_cursor) const ()
    at /home/bf/devel/standardese/src/translation_unit.cpp:146
#8  0x00000000007c3f19 in standardese::detail::<lambda(CXCursor, CXCursor, CXClientData)>::operator()(CXCursor, CXCursor, CXClientData) const (__closure=0x0, cursor=..., parent=..., 
    client_data=0x7ffb54317b40)
    at /home/bf/devel/standardese/include/standardese/translation_unit.hpp:122
#9  0x00000000007c3f69 in standardese::detail::<lambda(CXCursor, CXCursor, CXClientData)>::_FUN(CXCursor, CXCursor, CXClientData) () at /home/bf/devel/standardese/include/standardese/translation_unit.hpp:113
#10 0x00007ffb592f4e5d in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#11 0x00007ffb592f8799 in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#12 0x00007ffb592fa5dc in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#13 0x00007ffb592f497b in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#14 0x00007ffb592f4e8d in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#15 0x00007ffb592f8799 in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#16 0x00007ffb592f497b in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#17 0x00007ffb592f4e8d in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#18 0x00007ffb592f4c4e in ?? () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#19 0x00007ffb592fd4c4 in clang_visitChildren () from /usr/lib/llvm-3.8/lib/libclang-3.8.so.1
#20 0x00000000007c3ff4 in standardese::detail::visit_tu<standardese::translation_unit::translation_unit(const standardese::parser&, char const*, standardese::cpp_file*, const standardese::compile_config&)::<lambda(standardese::cpp_cursor, standardese::cpp_cursor)> >(CXTranslationUnit, CXFile, standardese::translation_unit::<lambda(standardese::cpp_cursor, standardese::cpp_cursor)>) (tu=0x7ffb44001810, 
    file=0x7ffb4402b400, f=...)
    at /home/bf/devel/standardese/include/standardese/translation_unit.hpp:125
#21 0x00000000007c3d95 in standardese::translation_unit::translation_unit (this=0x7ffb54317dc0, 
    par=..., path=0x181a310 "/home/bf/devel/trompeloeil/trompeloeil.hpp", file=0x7ffb4c000b40, 
    config=...) at /home/bf/devel/standardese/src/translation_unit.cpp:195
#22 0x00000000007b593a in standardese::parser::parse (this=0x1815fd0, 
    full_path=0x181a310 "/home/bf/devel/trompeloeil/trompeloeil.hpp", c=..., 
    file_name=0x181a2a8 "trompeloeil.hpp") at /home/bf/devel/standardese/src/parser.cpp:33
#23 0x000000000071f892 in <lambda(const boost::filesystem::path&, const boost::filesystem::path&)>::operator()(const boost::filesystem::path &, const boost::filesystem::path &) const (__closure=0x181a278, 
    p=..., relative=...) at /home/bf/devel/standardese/tool/main.cpp:210
#24 0x0000000000728ca9 in std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)>::__call<std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> >, 0ul, 1ul>(<unknown type in /var/t---Type <return> to continue, or q <return> to quit---
mp/standardese/tool/standardese, CU 0x0, DIE 0xf2e50>, std::_Index_tuple<0ul, 1ul>) (this=0x181a278, 
    __args=<unknown type in /var/tmp/standardese/tool/standardese, CU 0x0, DIE 0xf2e50>)
    at /usr/include/c++/5/functional:1074
#25 0x0000000000728b8f in std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)>::operator()<, std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > >(void) (this=0x181a278)
    at /usr/include/c++/5/functional:1133
#26 0x0000000000728adb in std::__invoke<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >(std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> &) (__f=...) at /usr/include/c++/5/functional:201
#27 0x0000000000728a51 in std::reference_wrapper<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >::operator()<>(void) const (this=0x7ffb54318d10) at /usr/include/c++/5/functional:428
#28 0x00000000007289d7 in std::_Bind_simple<std::reference_wrapper<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >()>::_M_invoke<>(std::_Index_tuple<>) (this=0x7ffb54318d10)
    at /usr/include/c++/5/functional:1531
#29 0x00000000007288c7 in std::_Bind_simple<std::reference_wrapper<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >()>::operator()(void) (this=0x7ffb54318d10) at /usr/include/c++/5/functional:1520
#30 0x000000000072866f in std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > >, std::__future_base::_Result_base::_Deleter>, std::_Bind_simple<std::reference_wrapper<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >()>, std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > >::operator()(void) const (this=0x7ffb54318d30) at /usr/include/c++/5/future:1319
#31 0x00000000007282a1 in std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>(), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > >, std::__future_base::_Result_base::_Deleter>, std::_Bind_simple<std::reference_wrapper<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)> >()>, std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > > >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/5/functional:1857
#32 0x000000000073e6f8 in std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const (this=0x7ffb54318d30)
    at /usr/include/c++/5/functional:2267
#33 0x0000000000737570 in std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) (
    this=0x181a250, __f=0x7ffb54318d30, __did_set=0x7ffb54318c7f) at /usr/include/c++/5/future:527
#34 0x0000000000762e98 in std::_Mem_fn_base<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), true>::operator()<std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*, void>(std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) const (this=0x7ffb54318c08, __object=0x181a250) at /usr/include/c++/5/functional:600
#35 0x000000000075cd91 in std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)>::_M_invoke<0ul, 1ul, 2ul>(std::_Index_tuple<0ul, 1ul, 2ul>) (this=0x7ffb54318bf0) at /usr/include/c++/5/functional:1531
#36 0x0000000000754042 in std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)>::operator()() (
    this=0x7ffb54318bf0) at /usr/include/c++/5/functional:1520
---Type <return> to continue, or q <return> to quit---
#37 0x0000000000748b27 in std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> >() ()
    at /usr/include/c++/5/mutex:706
#38 0x00007ffb5a170ad9 in __pthread_once_slow (once_control=0x181a268, 
    init_routine=0x71cec0 <__once_proxy@plt>) at pthread_once.c:116
#39 0x000000000071ebad in __gthread_once (__once=0x181a268, __func=0x71cec0 <__once_proxy@plt>)
    at /usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h:699
#40 0x000000000073e266 in std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) (__once=..., 
    __f=<unknown type in /var/tmp/standardese/tool/standardese, CU 0x0, DIE 0xa5cb6>)
    at /usr/include/c++/5/mutex:738
#41 0x000000000073708a in std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) (
    this=0x181a250, __res=..., __ignore_failure=false) at /usr/include/c++/5/future:387
#42 0x0000000000727809 in std::__future_base::_Task_state<std::_Bind<main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>(boost::filesystem::path, boost::filesystem::path)>, std::allocator<int>, std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> >()>::_M_run(void) (this=0x181a250) at /usr/include/c++/5/future:1403
#43 0x0000000000756db5 in std::packaged_task<std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> > ()>::operator()() (this=0x181a220) at /usr/include/c++/5/future:1547
#44 0x0000000000722e6f in ThreadPool::<lambda()>::operator()(void) const (__closure=0x1814260)
    at /home/bf/devel/standardese/external/ThreadPool/ThreadPool.h:80
#45 0x00000000007245b0 in std::_Function_handler<void(), ThreadPool::enqueue(F&&, Args&& ...) [with F = main(int, char**)::<lambda(const boost::filesystem::path&, const boost::filesystem::path&)>&; Args = {const boost::filesystem::path&, const boost::filesystem::path&}; typename std::result_of<_Functor(_ArgTypes ...)>::type = std::unique_ptr<standardese::md_document, std::default_delete<standardese::md_document> >]::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...)
    at /usr/include/c++/5/functional:1871
#46 0x000000000073b3c2 in std::function<void ()>::operator()() const (this=0x7ffb54318e30)
    at /usr/include/c++/5/functional:2267
#47 0x00000000007378ba in ThreadPool::ThreadPool(unsigned long)::{lambda()#1}::operator()() const ()
    at /home/bf/devel/standardese/external/ThreadPool/ThreadPool.h:55
#48 0x0000000000778d72 in std::_Bind_simple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) (this=0x1814438) at /usr/include/c++/5/functional:1531
#49 0x0000000000777024 in std::_Bind_simple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()>::operator()() (this=0x1814438) at /usr/include/c++/5/functional:1520
#50 0x0000000000773d08 in std::thread::_Impl<std::_Bind_simple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1} ()> >::_M_run() (this=0x1814420) at /usr/include/c++/5/thread:115
#51 0x00007ffb58531c80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#52 0x00007ffb5a1696fa in start_thread (arg=0x7ffb54319700) at pthread_create.c:333
#53 0x00007ffb57fa0b5d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Output from run is:

[debug] Using libclang version: clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
[debug] Using cmark version: 0.25.2                                                                     
[info] Generating documentation for "/home/bf/devel/trompeloeil/trompeloeil.hpp"...
[debug] parsing entity 'TROMPELOEIL_HPP_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:15) of type 'macro definition'                                                                                            
[debug] parsing entity 'TROMPELOEIL_NORETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:35) of type 'macro definition'                                                                                        
[debug] parsing entity '__cplusplus' (/home/bf/devel/trompeloeil/trompeloeil.hpp:36) of type 'macro expansion'                                                                                                  
[debug] parsing entity '__cplusplus' (/home/bf/devel/trompeloeil/trompeloeil.hpp:36) of type 'macro expansion'                                                                                                  
[debug] parsing entity 'tuple' (/home/bf/devel/trompeloeil/trompeloeil.hpp:40) of type 'inclusion directive'                                                                                                    
[debug] parsing entity 'iomanip' (/home/bf/devel/trompeloeil/trompeloeil.hpp:41) of type 'inclusion directive'                                                                                                  
[debug] parsing entity 'sstream' (/home/bf/devel/trompeloeil/trompeloeil.hpp:42) of type 'inclusion directive'                                                                                                  
[debug] parsing entity 'exception' (/home/bf/devel/trompeloeil/trompeloeil.hpp:43) of type 'inclusion directive'                                                                                                
[debug] parsing entity 'functional' (/home/bf/devel/trompeloeil/trompeloeil.hpp:44) of type 'inclusion directive'                                                                                               
[debug] parsing entity 'memory' (/home/bf/devel/trompeloeil/trompeloeil.hpp:45) of type 'inclusion directive'                                                                                                   
[debug] parsing entity 'cstring' (/home/bf/devel/trompeloeil/trompeloeil.hpp:46) of type 'inclusion directive'                                                                                                  
[debug] parsing entity 'regex' (/home/bf/devel/trompeloeil/trompeloeil.hpp:47) of type 'inclusion directive'                                                                                                    
[debug] parsing entity 'mutex' (/home/bf/devel/trompeloeil/trompeloeil.hpp:48) of type 'inclusion directive'                                                                                                    
[debug] parsing entity 'TROMPELOEIL_ASSERT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:54) of type 'macro definition'                                                                                          
[debug] parsing entity 'TROMPELOEIL_IDENTITY' (/home/bf/devel/trompeloeil/trompeloeil.hpp:57) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_ARG16' (/home/bf/devel/trompeloeil/trompeloeil.hpp:59) of type 'macro definition'                                                                                           
[debug] parsing entity 'TROMPELOEIL_COUNT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:61) of type 'macro definition'                                                                                           
[debug] parsing entity 'TROMPELOEIL_CONCAT_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:65) of type 'macro definition'                                                                                         
[debug] parsing entity 'TROMPELOEIL_CONCAT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:66) of type 'macro definition'                                                                                          
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:68) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:71) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:74) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:77) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:80) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:83) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:86) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:89) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:92) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:95) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:98) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:101) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:104) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:107) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:110) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:113) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_INIT_WITH_STR' (/home/bf/devel/trompeloeil/trompeloeil.hpp:115) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:119) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:123) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:127) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:131) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:135) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:139) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:143) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:147) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:151) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:155) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:159) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:164) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:168) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:172) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:176) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:179) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_PARAM_LIST' (/home/bf/devel/trompeloeil/trompeloeil.hpp:181) of type 'macro definition'                                                                                     
[debug] parsing entity 'TROMPELOEIL_PARAMS15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:185) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:186) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:187) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:188) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:189) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:190) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_PARAMS9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:191) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:192) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:193) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:194) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:195) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:196) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:197) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:198) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:199) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:200) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_PARAMS' (/home/bf/devel/trompeloeil/trompeloeil.hpp:202) of type 'macro definition'                                                                                         
[debug] parsing entity 'TROMPELOEIL_ASSERT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:655) of type 'macro expansion'                                                                                          
[debug] parsing entity 'TROMPELOEIL_ASSERT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:656) of type 'macro expansion'                                                                                          
[debug] parsing entity 'TROMPELOEIL_ASSERT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:660) of type 'macro expansion'                                                                                          
[debug] parsing entity 'TROMPELOEIL_NORETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:726) of type 'macro expansion'                                                                                        
[debug] parsing entity 'TROMPELOEIL_NORETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:2123) of type 'macro expansion'                                                                                       
[debug] parsing entity 'TROMPELOEIL_NORETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:2210) of type 'macro expansion'                                                                                       
[debug] parsing entity 'TROMPELOEIL_NORETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:2379) of type 'macro expansion'                                                                                       
[debug] parsing entity 'TROMPELOEIL_ID' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3240) of type 'macro definition'                                                                                            
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3313) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3315) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3317) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3319) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3321) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3323) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3325) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3327) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3329) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3331) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3333) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3335) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3337) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3339) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3341) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3343) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3346) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3348) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3350) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3352) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3354) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3356) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3358) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3360) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3362) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3364) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3366) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3368) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3370) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3372) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3374) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_CONST_MOCK15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3376) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_MAKE_MOCK_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3383) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_REQUIRE_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3457) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_REQUIRE_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3460) of type 'macro definition'                                                                                 
[debug] parsing entity 'TROMPELOEIL_NAMED_REQUIRE_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3465) of type 'macro definition'                                                                            
[debug] parsing entity 'TROMPELOEIL_NAMED_REQUIRE_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3468) of type 'macro definition'                                                                           
[debug] parsing entity 'TROMPELOEIL_REQUIRE_CALL_OBJ' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3471) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_ALLOW_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3477) of type 'macro definition'                                                                                    
[debug] parsing entity 'TROMPELOEIL_ALLOW_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3480) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_NAMED_ALLOW_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3485) of type 'macro definition'                                                                              
[debug] parsing entity 'TROMPELOEIL_NAMED_ALLOW_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3488) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_FORBID_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3492) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_FORBID_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3495) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_NAMED_FORBID_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3500) of type 'macro definition'                                                                             
[debug] parsing entity 'TROMPELOEIL_NAMED_FORBID_CALL_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3503) of type 'macro definition'                                                                            
[debug] parsing entity 'TROMPELOEIL_WITH' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3510) of type 'macro definition'                                                                                          
[debug] parsing entity 'TROMPELOEIL_LR_WITH' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3511) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_WITH_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3513) of type 'macro definition'                                                                                         
[debug] parsing entity 'TROMPELOEIL_SIDE_EFFECT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3534) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_LR_SIDE_EFFECT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3535) of type 'macro definition'                                                                                
[debug] parsing entity 'TROMPELOEIL_SIDE_EFFECT_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3537) of type 'macro definition'                                                                                  
[debug] parsing entity 'TROMPELOEIL_RETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3558) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_LR_RETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3559) of type 'macro definition'                                                                                     
[debug] parsing entity 'TROMPELOEIL_RETURN_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3561) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_THROW' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3582) of type 'macro definition'                                                                                         
[debug] parsing entity 'TROMPELOEIL_LR_THROW' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3583) of type 'macro definition'                                                                                      
[debug] parsing entity 'TROMPELOEIL_THROW_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3585) of type 'macro definition'                                                                                        
[debug] parsing entity 'TROMPELOEIL_TIMES' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3607) of type 'macro definition'                                                                                         
[debug] parsing entity 'TROMPELOEIL_IN_SEQUENCE' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3609) of type 'macro definition'                                                                                   
[debug] parsing entity 'TROMPELOEIL_ANY' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3612) of type 'macro definition'                                                                                           
[debug] parsing entity 'TROMPELOEIL_AT_LEAST' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3614) of type 'macro definition'                                                                                      
[debug] parsing entity 'TROMPELOEIL_AT_MOST' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3615) of type 'macro definition'                                                                                       
[debug] parsing entity 'TROMPELOEIL_REQUIRE_DESTRUCTION' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3617) of type 'macro definition'                                                                           
[debug] parsing entity 'TROMPELOEIL_REQUIRE_DESTRUCTION_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3620) of type 'macro definition'                                                                          
[debug] parsing entity 'TROMPELOEIL_NAMED_REQUIRE_DESTRUCTION' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3625) of type 'macro definition'                                                                     
[debug] parsing entity 'TROMPELOEIL_NAMED_REQUIRE_DESTRUCTION_' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3628) of type 'macro definition'                                                                    
[debug] parsing entity 'MAKE_MOCK0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3640) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3641) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3642) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3643) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3644) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3645) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3646) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3647) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3648) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3649) of type 'macro definition'                                                                                                
[debug] parsing entity 'MAKE_MOCK10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3650) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_MOCK11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3651) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_MOCK12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3652) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_MOCK13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3653) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_MOCK14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3654) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_MOCK15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3655) of type 'macro definition'                                                                                               
[debug] parsing entity 'MAKE_CONST_MOCK0' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3657) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK1' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3658) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK2' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3659) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK3' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3660) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK4' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3661) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK5' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3662) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK6' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3663) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK7' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3664) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK8' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3665) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK9' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3666) of type 'macro definition'                                                                                          
[debug] parsing entity 'MAKE_CONST_MOCK10' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3667) of type 'macro definition'                                                                                         
[debug] parsing entity 'MAKE_CONST_MOCK11' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3668) of type 'macro definition'                                                                                         
[debug] parsing entity 'MAKE_CONST_MOCK12' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3669) of type 'macro definition'                                                                                         
[debug] parsing entity 'MAKE_CONST_MOCK13' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3670) of type 'macro definition'                                                                                         
[debug] parsing entity 'MAKE_CONST_MOCK14' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3671) of type 'macro definition'                                                                                         
[debug] parsing entity 'MAKE_CONST_MOCK15' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3672) of type 'macro definition'                                                                                         
[debug] parsing entity 'REQUIRE_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3674) of type 'macro definition'                                                                                              
[debug] parsing entity 'NAMED_REQUIRE_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3675) of type 'macro definition'                                                                                        
[debug] parsing entity 'ALLOW_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3676) of type 'macro definition'                                                                                                
[debug] parsing entity 'NAMED_ALLOW_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3677) of type 'macro definition'                                                                                          
[debug] parsing entity 'FORBID_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3678) of type 'macro definition'                                                                                               
[debug] parsing entity 'NAMED_FORBID_CALL' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3679) of type 'macro definition'                                                                                         
[debug] parsing entity 'WITH' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3680) of type 'macro definition'                                                                                                      
[debug] parsing entity 'LR_WITH' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3681) of type 'macro definition'                                                                                                   
[debug] parsing entity 'SIDE_EFFECT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3682) of type 'macro definition'                                                                                               
[debug] parsing entity 'LR_SIDE_EFFECT' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3683) of type 'macro definition'                                                                                            
[debug] parsing entity 'RETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3684) of type 'macro definition'                                                                                                    
[debug] parsing entity 'LR_RETURN' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3685) of type 'macro definition'                                                                                                 
[debug] parsing entity 'THROW' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3686) of type 'macro definition'                                                                                                     
[debug] parsing entity 'LR_THROW' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3687) of type 'macro definition'                                                                                                  
[debug] parsing entity 'TIMES' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3688) of type 'macro definition'                                                                                                     
[debug] parsing entity 'IN_SEQUENCE' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3689) of type 'macro definition'                                                                                               
[debug] parsing entity 'ANY' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3690) of type 'macro definition'                                                                                                       
[debug] parsing entity 'AT_LEAST' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3691) of type 'macro definition'                                                                                                  
[debug] parsing entity 'AT_MOST' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3692) of type 'macro definition'                                                                                                   
[debug] parsing entity 'REQUIRE_DESTRUCTION' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3693) of type 'macro definition'                                                                                       
[debug] parsing entity 'NAMED_REQUIRE_DESTRUCTION' (/home/bf/devel/trompeloeil/trompeloeil.hpp:3694) of type 'macro definition'                                                                                 
[debug] parsing entity 'trompeloeil' (/home/bf/devel/trompeloeil/trompeloeil.hpp:204) of type 'Namespace'                                                                                                       
[debug] parsing entity 'specialized' (/home/bf/devel/trompeloeil/trompeloeil.hpp:206) of type 'ClassDecl'                                                                                                       
[debug] parsing entity 'get_lock()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:209) of type 'FunctionTemplate'                                                                                                 
[debug] parsing entity 'conditional_tuple_element<N, T, legal>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:216) of type 'ClassTemplate'                                                                        
[debug] parsing entity 'N' (/home/bf/devel/trompeloeil/trompeloeil.hpp:215) of type 'NonTypeTemplateParameter'                                                                                                  
[debug] parsing entity 'T' (/home/bf/devel/trompeloeil/trompeloeil.hpp:215) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'legal' (/home/bf/devel/trompeloeil/trompeloeil.hpp:215) of type 'NonTypeTemplateParameter'                                                                                              
[debug] parsing entity 'type' (/home/bf/devel/trompeloeil/trompeloeil.hpp:218) of type 'TypeAliasDecl'  
[debug] parsing entity 'conditional_tuple_element<N, T, false>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221) of type 'ClassTemplatePartialSpecialization'                                                   
[debug] parsing entity 'N' (/home/bf/devel/trompeloeil/trompeloeil.hpp:220) of type 'NonTypeTemplateParameter'                                                                                                  
[debug] parsing entity 'T' (/home/bf/devel/trompeloeil/trompeloeil.hpp:220) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'N' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221) of type 'DeclRefExpr'       
[warning] when parsing 'N' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221): Unknown cursor kind 'DeclRefExpr'
[debug] parsing entity 'T' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221) of type 'TypeRef'
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221) of type 'CXXBoolLiteralExpr' 
[warning] when parsing '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:221): Unknown cursor kind 'CXXBoolLiteralExpr'
[debug] parsing entity 'type' (/home/bf/devel/trompeloeil/trompeloeil.hpp:223) of type 'TypeAliasDecl'
[debug] parsing entity 'param_list<T>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:226) of type 'ClassTemplate'                                                                                                 
[debug] parsing entity 'param_list<R (P...)>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:229) of type 'ClassTemplatePartialSpecialization'                                                                     
[debug] parsing entity 'R' (/home/bf/devel/trompeloeil/trompeloeil.hpp:228) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'P' (/home/bf/devel/trompeloeil/trompeloeil.hpp:228) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'R' (/home/bf/devel/trompeloeil/trompeloeil.hpp:229) of type 'TypeRef'           
[debug] parsing entity 'param_tuple' (/home/bf/devel/trompeloeil/trompeloeil.hpp:231) of type 'TypeAliasDecl'                                                                                                   
[debug] parsing entity 'size' (/home/bf/devel/trompeloeil/trompeloeil.hpp:232) of type 'VarDecl'        
[debug] parsing entity 'type' (/home/bf/devel/trompeloeil/trompeloeil.hpp:234) of type 'TypeAliasTemplateDecl'                                                                                                  
[debug] parsing entity 'param_list_t' (/home/bf/devel/trompeloeil/trompeloeil.hpp:238) of type 'TypeAliasTemplateDecl'                                                                                          
[debug] parsing entity 'expectation_violation' (/home/bf/devel/trompeloeil/trompeloeil.hpp:240) of type 'ClassDecl'                                                                                             
[debug] parsing entity 'std::logic_error' (/home/bf/devel/trompeloeil/trompeloeil.hpp:240) of type 'C++ base class specifier'                                                                                   
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:242) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'logic_error' (/home/bf/devel/trompeloeil/trompeloeil.hpp:243) of type 'UsingDeclaration'                                                                                                
[debug] parsing entity 'location' (/home/bf/devel/trompeloeil/trompeloeil.hpp:246) of type 'StructDecl' 
[debug] parsing entity 'location()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:248) of type 'CXXConstructor'                                                                                                   
[debug] parsing entity 'location(const char *, unsigned long)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:254) of type 'CXXConstructor'                                                                        
[debug] parsing entity 'file' (/home/bf/devel/trompeloeil/trompeloeil.hpp:263) of type 'FieldDecl'      
[debug] parsing entity 'line' (/home/bf/devel/trompeloeil/trompeloeil.hpp:264) of type 'FieldDecl'      
[debug] parsing entity 'operator<<(std::ostream &, const trompeloeil::location &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:269) of type 'FunctionDecl'                                                      
[debug] parsing entity 'severity' (/home/bf/devel/trompeloeil/trompeloeil.hpp:277) of type 'EnumDecl'   
[debug] parsing entity 'fatal' (/home/bf/devel/trompeloeil/trompeloeil.hpp:277) of type 'EnumConstantDecl'                                                                                                      
[debug] parsing entity 'nonfatal' (/home/bf/devel/trompeloeil/trompeloeil.hpp:277) of type 'EnumConstantDecl'                                                                                                   
[debug] parsing entity 'reporter_func' (/home/bf/devel/trompeloeil/trompeloeil.hpp:279) of type 'TypeAliasDecl'                                                                                                 
[debug] parsing entity 'default_reporter(trompeloeil::severity, const char *, unsigned long, const std::string &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:285) of type 'FunctionDecl'                      
[debug] parsing entity 'reporter_obj()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:301) of type 'FunctionDecl'                                                                                                 
[debug] parsing entity 'set_reporter(reporter_func)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:308) of type 'FunctionDecl'                                                                                    
[debug] parsing entity 'tracer' (/home/bf/devel/trompeloeil/trompeloeil.hpp:314) of type 'ClassDecl'    
[debug] parsing entity 'tracer_obj()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:318) of type 'FunctionDecl'                                                                                                   
[debug] parsing entity 'set_tracer(trompeloeil::tracer *)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:327) of type 'FunctionDecl'                                                                              
[debug] parsing entity 'tracer' (/home/bf/devel/trompeloeil/trompeloeil.hpp:337) of type 'ClassDecl'    
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:339) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'trace(const char *, unsigned long, const std::string &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:342) of type 'CXXMethod'                                                           
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:346) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'tracer()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:347) of type 'CXXConstructor'                                                                                                     
[debug] parsing entity 'tracer(const trompeloeil::tracer &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:350) of type 'CXXConstructor'                                                                          
[debug] parsing entity 'operator=(const trompeloeil::tracer &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:351) of type 'CXXMethod'                                                                            
[debug] parsing entity '~tracer()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:353) of type 'CXXDestructor'                                                                                                     
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:357) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'previous' (/home/bf/devel/trompeloeil/trompeloeil.hpp:358) of type 'FieldDecl'  
[debug] parsing entity 'stream_tracer' (/home/bf/devel/trompeloeil/trompeloeil.hpp:361) of type 'ClassDecl'                                                                                                     
[debug] parsing entity 'class trompeloeil::tracer' (/home/bf/devel/trompeloeil/trompeloeil.hpp:361) of type 'C++ base class specifier'                                                                          
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:363) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'stream_tracer(std::ostream &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:364) of type 'CXXConstructor'                                                                                
[debug] parsing entity 'trace(const char *, unsigned long, const std::string &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:368) of type 'CXXMethod'                                                           
[debug] parsing entity '' (/home/bf/devel/trompeloeil/trompeloeil.hpp:376) of type 'CXXAccessSpecifier' 
[debug] parsing entity 'stream' (/home/bf/devel/trompeloeil/trompeloeil.hpp:377) of type 'FieldDecl'    
[debug] parsing entity 'reporter<T>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:381) of type 'ClassTemplate'                                                                                                   
[debug] parsing entity 'send_report(trompeloeil::severity, trompeloeil::location, const std::string &)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:385) of type 'FunctionTemplate'                             
[debug] parsing entity 'reporter<T>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:394) of type 'ClassTemplate'                                                                                                   
[debug] parsing entity 'T' (/home/bf/devel/trompeloeil/trompeloeil.hpp:393) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'send(trompeloeil::severity, const char *, unsigned long, const char *)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:398) of type 'CXXMethod'                                            
[debug] parsing entity 'ignore(const T &...)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:420) of type 'FunctionTemplate'                                                                                       
[debug] parsing entity 'matcher' (/home/bf/devel/trompeloeil/trompeloeil.hpp:427) of type 'StructDecl'  
[debug] parsing entity 'is_matcher_(...)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:429) of type 'FunctionDecl'                                                                                               
[debug] parsing entity 'is_matcher_(const trompeloeil::matcher *)' (/home/bf/devel/trompeloeil/trompeloeil.hpp:431) of type 'FunctionDecl'                                                                      
[debug] parsing entity 'is_matcher' (/home/bf/devel/trompeloeil/trompeloeil.hpp:434) of type 'TypeAliasTemplateDecl'                                                                                            
[debug] parsing entity 'typed_matcher<T>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:437) of type 'ClassTemplate'                                                                                              
[debug] parsing entity 'T' (/home/bf/devel/trompeloeil/trompeloeil.hpp:436) of type 'TemplateTypeParameter'                                                                                                     
[debug] parsing entity 'struct trompeloeil::matcher' (/home/bf/devel/trompeloeil/trompeloeil.hpp:437) of type 'C++ base class specifier'                                                                        
[debug] parsing entity 'operator type-parameter-0-0()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:439) of type 'CXXConversion'                                                                                 
[debug] parsing entity 'typed_matcher<std::nullptr_t>' (/home/bf/devel/trompeloeil/trompeloeil.hpp:443) of type 'StructDecl'                                                                                    
[debug] parsing entity 'std' (/home/bf/devel/trompeloeil/trompeloeil.hpp:443) of type 'NamespaceRef'    
[debug] parsing entity 'nullptr_t' (/home/bf/devel/trompeloeil/trompeloeil.hpp:443) of type 'TypeRef'   
[debug] parsing entity 'struct trompeloeil::matcher' (/home/bf/devel/trompeloeil/trompeloeil.hpp:443) of type 'C++ base class specifier'                                                                        
[debug] parsing entity 'operator type-parameter-0-0 &&()' (/home/bf/devel/trompeloeil/trompeloeil.hpp:446) of type 'FunctionTemplate'                                                                           
standardese: /home/bf/devel/standardese/src/cpp_template.cpp:281: unsigned int {anonymous}::get_template_offset(standardese::translation_unit&, standardese::cpp_cursor, unsigned int): Assertion `source[last_offset] == '>'' failed.
Aborted (core dumped)

Empty C comments trigger an assertion

/***/
struct Bar {};

The above code triggers the following exception:

standardese:/standardese/src/detail/raw_comment.cpp:135: standardese::detail::raw_comment {anonymous}::parse_c_comment(const char*&, unsigned int&): Assertion `!content.empty()' failed.
Abandon

Changing the empty comment to /// is correctly handled.

Snippets for Examples

Is there currently a way to include snippets like Doxygen's \snippet command or include files like Doxygen's \include command? If not this would be extremely useful to have so that examples can link to code that is verified to work in tests. I wasn't able to find either \snippet or \include or ones like them. Thanks!

Move AST handling to an independent library

As you know I have been thinking on porting siplasplas reflection engine parser to C++ for a while. Since you have done the same work, I think sharing a libclang wrapper as an independent project could be a way to a) save some of my time ;) and b) maintain and improve it with my help.

What do you think?

Allow inheriting documentation

I have a template type which composites itself from many class fragments inside namespace detail depending on its input types.

I'd like the documentation for the member functions inside the class fragments inside namespace detail to be inherited and displayed in the most derived class.

I do not want to document the class fragments inside namespace detail. I just want the public member functions inherited to appear in the documentation.

"Requires" and concepts

One of the examples is:

/// \effects Exchanges values stored in two locations.
/// \requires Type `T` shall be `MoveConstructible` and `MoveAssignable`.
template <class T>
void swap(T &a, T &b) noexcept(...);

Perhaps it would be better to have the "requires" clause formatted in some way other than prose. For example:

/// \effects Exchanges values stored in two locations.
/// \requires T MoveConstructible
/// \requires T MoveAssignable
template <class T>
void swap(T &a, T &b) noexcept(...);

Or:

/// \effects Exchanges values stored in two locations.
/// \requires T MoveConstructible MoveAssignable
template <class T>
void swap(T &a, T &b) noexcept(...);

Both of these could produce exactly the same result as the original.

However, it would be easy to add enhancements, like linking to concept documentation. In the long run, these manual "requires" can even be combined with stuff gleaned from in-code requires expressions when concepts rolls around, and maybe even eventually phased out:

// TODAY:
/// \effects Exchanges values stored in two locations.
/// \requires T MoveConstructible MoveAssignable
template <class T>
void swap(T &a, T &b) noexcept(...);

// C++20 (manual requires command redundant, but not an error):
/// \effects Exchanges values stored in two locations.
/// \requires T MoveConstructible MoveAssignable
template <class T>
requires MoveConstructible<T> && MoveAssignable<T>
void swap(T &a, T &b) noexcept(...);

// C++?? (unnecessary command eventually removed):
/// \effects Exchanges values stored in two locations.
template <class T>
requires MoveConstructible<T> && MoveAssignable<T>
void swap(T &a, T &b) noexcept(...);

Manually added requires clauses can be added with requires clauses deduced from code (when concepts rolls around):

/// \requires T MoveAssignable
/// \requires "Something else."
template <typename T>
requires DefaultConstructible<T>
void foo(T);

// produces:
Requires: `T` must be MoveAssignable and DefaultConstructible. Something Else.

/// \requires "And so on."
void foo(EqualityComparable a);

// produces:
Requires: Type of argument `a` must be EqualityComparable. And so on.

We don't have concepts yet, but we know they're coming. Having a way to express concept requirements in documentation today... that we can later convert to actual concepts checked by the compiler sometime in the future... would be awesome.

If the command "\requires" cannot be changed (for compatibility with Doxygen), then perhaps a new command "\requires-concept" or "\requires-constraints" could be used.

Class name in partial specialization appends -parameter-X-X

When mentioning the class name in templates, libclang "helpfully" appends the template parameters.
But those are weird internal names for partial specializations, so they shouldn't be visible.

I've added a temporary workaround™ that simply searches for those names and removes them.
This however is inconsistent with the behavior in full specializations where the parameters are appended and not removed because they are correct.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.