diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index c3366b0967b..13cb12c48aa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -2666,7 +2666,7 @@ public class Scanner2Test extends BaseScanner2Test validateChar( "s" ); } - public void testBug185120() throws Exception { + public void testBug185120_1() throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append("#define TEST_DEFINE 1UL\n"); buffer.append("#if TEST_DEFINE != 1UL\n"); @@ -2677,4 +2677,16 @@ public class Scanner2Test extends BaseScanner2Test initializeScanner( buffer.toString() ); validateToken( IToken.tPLUS ); } + + public void testBug185120_2() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("#define TEST_DEFINE 1LLU\n"); + buffer.append("#if TEST_DEFINE != 1ULL\n"); + buffer.append("-\n"); + buffer.append("#else\n"); + buffer.append("+\n"); + buffer.append("#endif\n"); + initializeScanner( buffer.toString() ); + validateToken( IToken.tPLUS ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java index 705574c3cd0..27086c46bd8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java @@ -622,7 +622,14 @@ public class ExpressionEvaluator { if (pos < limit) { c= buffer[pos]; if (c == 'L' || c == 'l' || c == 'U' || c == 'u') { - ++bufferPos[bufferStackPos]; + pos= ++bufferPos[bufferStackPos]; + // gcc-extension: allow ULL for unsigned long long literals + if (pos < limit) { + c= buffer[pos]; + if (c == 'L' || c == 'l' || c == 'U' || c == 'u') { + pos= ++bufferPos[bufferStackPos]; + } + } } } }