aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancois Ferrand <thetypz@gmail.com>2015-02-26 16:06:10 +0100
committerFrancois Ferrand <thetypz@gmail.com>2015-02-27 14:49:55 +0000
commit1336502f588b3bbcfa33fd57b449174eee9711e9 (patch)
tree8892e9bf78de533e7a19a6aa0f3eed870a9124b9
parent672ab5c8d80f393849a938f46c70d5dcfb87e440 (diff)
C++: fix parsing nested C99 designated initializers.
Change-Id: Iaa0e7550abf6be77601b1852652bb3d0731d0323 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp8
-rw-r--r--tests/auto/cplusplus/c99/data/designatedInitializer.1.c9
2 files changed, 16 insertions, 1 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 19bcd358b57..4f44d614658 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -5696,7 +5696,13 @@ bool Parser::parseDesignatedInitializer(ExpressionAST *&node)
if (LA() == T_EQUAL) {
ast->equal_token = consumeToken();
- if (parseAssignmentExpression(ast->initializer)) {
+
+ if (LA() == T_LBRACE) {
+ if (parseBracedInitList0x(node)) {
+ node = ast;
+ return true;
+ }
+ } else if (parseAssignmentExpression(ast->initializer)) {
node = ast;
return true;
}
diff --git a/tests/auto/cplusplus/c99/data/designatedInitializer.1.c b/tests/auto/cplusplus/c99/data/designatedInitializer.1.c
index 43db4b66477..dcb482f6d61 100644
--- a/tests/auto/cplusplus/c99/data/designatedInitializer.1.c
+++ b/tests/auto/cplusplus/c99/data/designatedInitializer.1.c
@@ -7,3 +7,12 @@ int a[10] = {2, 4, [8]=9, 10};
int a[MAX] = {
1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};
+struct {
+ int table [3];
+ struct {
+ int a;
+ int b;
+ } parts;
+} a[MAX] = {
+ [2] = { .table = { 8, [1] = 7, 6 }, .parts = { .a = 0, 1 } }
+};