}
struct CYKey {
+ unsigned priority_ = 0;
+
std::string code_;
unsigned flags_;
};
CYCXString spelling(cursor);
std::string name(spelling);
std::ostringstream value;
+ unsigned priority(2);
unsigned flags(0);
/*CXSourceLocation location(clang_getCursorLocation(cursor));
} break;
case CXCursor_StructDecl: {
- if (!clang_isCursorDefinition(cursor))
- goto skip;
if (spelling[0] == '\0')
goto skip;
+ if (!clang_isCursorDefinition(cursor))
+ priority = 1;
std::ostringstream types;
std::ostringstream names;
{
CYKey &key(baton.keys[name]);
- key.code_ = value.str();
- key.flags_ = flags;
+ if (key.priority_ < priority) {
+ key.priority_ = priority;
+ key.code_ = value.str();
+ key.flags_ = flags;
+ }
}
skip:
ffi->alignment = 0;
ffi->type = FFI_TYPE_STRUCT;
- ffi->elements = new(pool) ffi_type *[signature.count + 1];
- for (size_t index(0); index != signature.count; ++index)
- ffi->elements[index] = signature.elements[index].type->GetFFI(pool);
- ffi->elements[signature.count] = NULL;
+ if (signature.count == 0) {
+ // https://gcc.gnu.org/ml/gcc-patches/2015-01/msg01286.html
+ ffi->elements = new(pool) ffi_type *[2];
+ ffi->elements[0] = &ffi_type_void;
+ ffi->elements[1] = NULL;
+ } else {
+ ffi->elements = new(pool) ffi_type *[signature.count + 1];
+ for (size_t index(0); index != signature.count; ++index)
+ ffi->elements[index] = signature.elements[index].type->GetFFI(pool);
+ ffi->elements[signature.count] = NULL;
+ }
return ffi;
}