changeset: 303799:250eee268917 branch: release81 user: Petr Kudryavtsev date: Mon Nov 02 14:01:41 2015 +0300 summary: Fixed #256296 - Additional parens in expression break parser diff -r 930a1c0f0231 -r 250eee268917 cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionTokenProcessor.java --- a/cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionTokenProcessor.java Fri Oct 30 23:30:07 2015 +0300 +++ b/cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionTokenProcessor.java Mon Nov 02 14:01:41 2015 +0300 @@ -1954,8 +1954,33 @@ CsmCompletionExpression opExp = createTokenExp(UNARY_OPERATOR); pushExp(opExp); // add operator as new exp break; + + case CONVERSION: + if (top.getTokenCount() > 0) { + CppTokenId firstTokId = top.getTokenID(0); + if (CppTokenId.STATIC_CAST == firstTokId || + CppTokenId.DYNAMIC_CAST == firstTokId || + CppTokenId.REINTERPRET_CAST == firstTokId) + { + // Postfix operator + opExp = createTokenExp(UNARY_OPERATOR); + popExp(); + opExp.addParameter(top); + pushExp(opExp); + } else if (top.getParameterCount() > 0 && top.getParameter(0).getExpID() != TYPE) { + // Postfix operator after PARENTHESIS + opExp = createTokenExp(UNARY_OPERATOR); + popExp(); + opExp.addParameter(createTokenExp(PARENTHESIS, top, true)); + pushExp(opExp); + } else { + errorState = true; + } + } + break; - case VARIABLE: // is it only one permitted? + case PARENTHESIS: + case VARIABLE: // Postfix operator opExp = createTokenExp(UNARY_OPERATOR); popExp(); // pop top diff -r 930a1c0f0231 -r 250eee268917 cnd.completion/test/unit/data/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/BasicHyperlinkTestCase/bug256296.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cnd.completion/test/unit/data/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/BasicHyperlinkTestCase/bug256296.cpp Mon Nov 02 14:01:41 2015 +0300 @@ -0,0 +1,10 @@ +namespace bug256296 { + struct AAA256296 { + int field; + }; + + int foo256296() { + AAA256296 *pointer = 0; + return ((pointer)++)->field; + } +} \ No newline at end of file diff -r 930a1c0f0231 -r 250eee268917 cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/BasicHyperlinkTestCase.java --- a/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/BasicHyperlinkTestCase.java Fri Oct 30 23:30:07 2015 +0300 +++ b/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/BasicHyperlinkTestCase.java Mon Nov 02 14:01:41 2015 +0300 @@ -1154,6 +1154,11 @@ performTest("bug255900.h", 4, 9, "bug255900.cpp", 1, 1); } + public void testBug256296() throws Exception { + // Bug 256296 - Additional parens in expression break parser + performTest("bug256296.cpp", 8, 32, "bug256296.cpp", 3, 9); + } + public static class Failed extends HyperlinkBaseTestCase { @Override