summaryrefslogtreecommitdiff
path: root/src/libs/3rdparty/cplusplus/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Parser.cpp')
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 3c509be00c..1550c8b31d 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -1527,10 +1527,23 @@ bool Parser::parseDeclSpecifierSeq(SpecifierListAST *&decl_specifier_seq,
} else if (! onlySimpleTypeSpecifiers && ! has_type_specifier &&
(LA() == T_TYPENAME || LA() == T_ENUM || lookAtClassKey())) {
// typename-specifier, elaborated-type-specifier
- int startOfElaboratedTypeSpecifier = cursor();
+ int startOfTypeSpecifier = cursor();
if (! parseElaboratedTypeSpecifier(*decl_specifier_seq_ptr)) {
- error(startOfElaboratedTypeSpecifier, "expected an elaborated type specifier");
- break;
+ rewind(startOfTypeSpecifier);
+ if (LA() == T_ENUM) {
+ if (!parseEnumSpecifier(*decl_specifier_seq_ptr)) {
+ error(startOfTypeSpecifier, "expected an enum specifier");
+ break;
+ }
+ } else if (lookAtClassKey()) {
+ if (!parseClassSpecifier(*decl_specifier_seq_ptr)) {
+ error(startOfTypeSpecifier, "expected a class specifier");
+ break;
+ }
+ } else {
+ error(startOfTypeSpecifier, "expected an elaborated type specifier");
+ break;
+ }
}
decl_specifier_seq_ptr = &(*decl_specifier_seq_ptr)->next;
has_type_specifier = true;