diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 0c558bf4dd..66e0e9d022 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -1168,7 +1168,9 @@ TOKEN : | | - : PRAGMALINE + {parenNesting=-1; SwitchTo(PRAGMALINE); } + | + {parenNesting=0; SwitchTo(PRAGMALINE); } | | @@ -1352,9 +1354,9 @@ TOKEN : | <#PDIGIT : [ "0"-"9" ]> | - { parenNesting++; } + { if (parenNesting != -1) parenNesting++; } | - { parenNesting--; if (parenNesting == 0) SwitchTo(DEFAULT); } + { if (parenNesting != -1) parenNesting--; if (parenNesting == 0) SwitchTo(DEFAULT); } | | @@ -1460,7 +1462,8 @@ TOKEN : //jjt SimpleNode TranslationUnit() #TranslationUnit : {} void TranslationUnit() : {} { - ( ExternalDeclaration() )+ + ( ExternalDeclaration() )+ + < EOF > { //jjt return jjtThis; } @@ -1910,7 +1913,8 @@ Token MultiLineString() : { void PragmaSpec() : { } { - ( ( ) PragmaSpecifier() ) + (PragmaSpecifier())+ | + PragmaSpecifier() } @@ -2765,7 +2769,7 @@ Object AssignmentExpression() : { | LOOKAHEAD(3) obj = ConditionalExpression() - ) + ) [ PragmaSpec() ] { return obj; } diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java index 52282a5823..30534e0d9b 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java @@ -222,18 +222,21 @@ public class CParserTest extends AbstractGhidraHeadlessIntegrationTest { String parseMessages = parser.getParseMessages(); System.out.println(parseMessages); - assertTrue("Duplicate ENUM message missing", parseMessages.contains("duplicate enum value: options_enum : PLUS_SET : 16")); - - assertTrue("Duplicate ENUM message missing", parseMessages.contains("Static_Asssert has failed \"\"math fail!\"\"")); - - assertTrue("Duplicate ENUM message missing", parseMessages.contains("Static_Asssert has failed \"\"1 + 1 == 3, fail!\"\"")); - DataType dt; DataType pointedToDT; ParameterDefinition[] funcArgs; FunctionDefinition funcDef; String str; + dt = dtMgr.getDataType(new CategoryPath("/"), "pragmaPassed"); + assertNotNull("Structure after pragma not parsed", dt); + + assertTrue("Duplicate ENUM message missing", parseMessages.contains("duplicate enum value: options_enum : PLUS_SET : 16")); + + assertTrue("Duplicate ENUM message missing", parseMessages.contains("Static_Asssert has failed \"\"math fail!\"\"")); + + assertTrue("Duplicate ENUM message missing", parseMessages.contains("Static_Asssert has failed \"\"1 + 1 == 3, fail!\"\"")); + dt = dtMgr.getDataType(new CategoryPath("/"), "_IO_FILE_complete"); Structure sldt = (Structure) dt; DataTypeComponent data3 = sldt.getComponent(2); diff --git a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h index 08a2a243c0..7cfcec29bd 100644 --- a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h +++ b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h @@ -178,6 +178,8 @@ int (__stdcall * GetSectionBlock) ( // nothing will parse after this line if the this fails #pragma test for, pragma, with, commas outside parens + + #pragma region System Family (kernel drivers) with Desktop Family for compat #pragma warning(disable) @@ -190,6 +192,22 @@ int (__stdcall * GetSectionBlock) ( #pragma our macros nachos (for use only within FileProvider.h) #pragma warning (suppress: 28128) + +struct pragmaPassed { + char dummy; +}; + +int whileWithPragma(int a) +{ + do { + a++; + } while (0 __pragma(warning(disable: 28110))); + + __pragma(warning(push)) __pragma(warning(disable : 4548)) do {__noop(pszDest);} while((0,0) __pragma(warning(pop)) ); + + return a; +} + int g(int a, int b, int c) {