diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-11-03 14:25:46 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-11-09 10:56:17 +0000 |
commit | 882dd60aad7e7718f9cc067baab3ca725f061e10 (patch) | |
tree | 75f7df977516d8d11b2ad945d6a17d459dde56c0 /src/libs/3rdparty/cplusplus/Parser.cpp | |
parent | 53115259baa522d0d2d8f05aaa058693b1de62a8 (diff) | |
download | qt-creator-882dd60aad7e7718f9cc067baab3ca725f061e10.tar.gz |
C++: Extend alias declaration support in built-in parser
The type-id in an alias declaration can also define a new type.
Change-Id: I65dc397d2526c56334676c6ab522564f6748d594
Task-number: QTCREATORBUG-24875
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Parser.cpp')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 19 |
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; |