diff -urp global-6.3.2/libparser/Cpp.c global-6.3-2/libparser/Cpp.c --- global-6.3.2/libparser/Cpp.c 2014-09-04 15:46:14 +1000 +++ global-6.3-2/libparser/Cpp.c 2014-11-26 15:21:33 +1000 @@ -182,19 +182,41 @@ Cpp(const struct parser_param *param) else pushbacktoken(); break; + case CPP_STRUCT: case CPP_CLASS: - DBG_PRINT(level, "class"); - if ((c = nexttoken(interested, cpp_reserved_word)) == SYMBOL) { - strlimcpy(classname, token, sizeof(classname)); + DBG_PRINT(level, cc == CPP_CLASS ? "class" : "struct"); + while ((c = nexttoken(interested, cpp_reserved_word)) == CPP___ATTRIBUTE__ || c == '\n') + if (c == CPP___ATTRIBUTE__) + process_attribute(param); + if (c == SYMBOL) { + int newlines = 0; + char *saveline; + strbuf_reset(sb); + strbuf_puts(sb, sp); + saveline = strbuf_value(sb); + for (;;) { + strlimcpy(classname, token, sizeof(classname)); + c = nexttoken(interested, cpp_reserved_word); + if (c == SYMBOL) { + newlines = 0; + strbuf_reset(sb); + strbuf_puts(sb, sp); + saveline = strbuf_value(sb); + } else if (c == '\n') + ++newlines; + else + break; + } /* * Ignore forward definitions. * "class name;" */ - if (peekc(0) != ';') { + if (c != ';') { startclass = 1; - PUT(PARSER_DEF, token, lineno, sp); + PUT(PARSER_DEF, classname, lineno - newlines, saveline); } } + pushbacktoken(); break; case '{': /* } */ DBG_PRINT(level, "{"); /* } */ @@ -309,7 +331,6 @@ Cpp(const struct parser_param *param) if ((c = nexttoken(interested, cpp_reserved_word)) == SYMBOL) PUT(PARSER_REF_SYM, token, lineno, sp); break; - case CPP_STRUCT: case CPP_ENUM: case CPP_UNION: while ((c = nexttoken(interested, cpp_reserved_word)) == CPP___ATTRIBUTE__)