This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 122091

Summary: Evaluation of preprocessor expression containing macro with empty body is not correct
Product: cnd Reporter: Alexander Simon <alexvsimon>
Component: Code ModelAssignee: Vladimir Voskresensky <vv159170>
Status: VERIFIED FIXED    
Severity: blocker    
Priority: P1    
Version: 6.x   
Hardware: All   
OS: Solaris   
Issue Type: DEFECT Exception Reporter:
Bug Depends on:    
Bug Blocks: 108501    
Attachments: proposed patch

Description Alexander Simon 2007-11-16 08:51:25 UTC
Evaluation of preprocessor expression "not or" do not work.
Add to arg.c following code:
---------------
#if !(vax || u3b || u3b15 || u3b2 || i386 || sparc)
#include "### No code for processor type ###"
#endif
---------------
Code is compilable by GNU & SUN compilers.
For GNU collection code model is right (include directive is grey).
For SUN collection code model is wrong (include directive is active).
Difference in predefined system macros "i386"
GNU C collection:
i386=1
SUN C collection:
i386
I do not know which subsystem get wrong information. I have two guess:
1. project system should get "i386=1" for SUN C collection
2. code model should interpret macros without value as true.

P2 because wrong evaluating of such expression can produce absolutely wrong model.
For example Open Solaris project.

Note: SUN C++ collection has both macros:
i386
...
i386=1
Is it right? Which macros will be used in code model?
Comment 1 Alexander Simon 2007-11-16 09:05:55 UTC
Investigation shows that value of i386=1 for SUN C collection.
Verify please list of predefined macros for SUN collections.
I think that it is P1 for Sun Studio.
Comment 2 Vladimir Voskresensky 2007-11-16 11:16:07 UTC
simplified test case:

#define A

#if !(A || B)
int a;
#endif

The problem caused by expanding token stream process. When expanding is performed for pp-expressions => all defined
macro must be "1"-number token assigned on expanding, not empty token stream as it's usually expanded in code
Comment 3 Vladimir Voskresensky 2007-11-16 12:10:38 UTC
we need a mode of expanding stream for preprocessor expressions.
in this mode all defined macros with empty body are expanded to default body (token number "1")
Comment 4 Vladimir Voskresensky 2007-11-16 12:11:42 UTC
Created attachment 53108 [details]
proposed patch
Comment 5 Vladimir Voskresensky 2007-11-16 12:23:29 UTC
fixed:
- when preproc expression is expanded all empty-body macros must be expanded with default body

cvs log:
Checking in impl/support/APTBaseMacroMap.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/impl/support/APTBaseMacroMap.java,v  <-- 
APTBaseMacroMap.java
new revision: 1.12; previous revision: 1.11
done
Checking in support/APTConditionResolver.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTConditionResolver.java,v  <-- 
APTConditionResolver.java
new revision: 1.4; previous revision: 1.3
done
Checking in support/APTExpandedStream.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTExpandedStream.java,v  <-- 
APTExpandedStream.java
new revision: 1.4; previous revision: 1.3
done
Checking in utils/APTUtils.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/utils/APTUtils.java,v  <--  APTUtils.java
new revision: 1.16; previous revision: 1.15
done
Comment 6 Vladimir Voskresensky 2007-11-16 12:31:06 UTC
+ test
cvs log:
Checking in data/goldenfiles/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc.err;
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/data/goldenfiles/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc.err,v
 <--  ppExpressionAndEmptyBodyMacro.cc.err
initial revision: 1.1
done
RCS file:
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/data/goldenfiles/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc.dat,v
done
Checking in data/goldenfiles/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc.dat;
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/data/goldenfiles/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc.dat,v
 <--  ppExpressionAndEmptyBodyMacro.cc.dat
initial revision: 1.1
done
RCS file:
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/data/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc,v
done
Checking in data/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc;
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/data/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest/ppExpressionAndEmptyBodyMacro.cc,v
 <--  ppExpressionAndEmptyBodyMacro.cc
initial revision: 1.1
done
Checking in src/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest.java;
/shared/data/ccvs/repository/cnd/modelimpl/test/unit/src/org/netbeans/modules/cnd/modelimpl/trace/FileModelTest.java,v 
<--  FileModelTest.java
new revision: 1.22; previous revision: 1.21
done
Comment 7 Vladimir Kvashin 2007-11-16 23:50:37 UTC
I've reviewed the fix.
I believe the fix is correct and safe.
Comment 8 Alexander Pepin 2007-11-18 21:07:14 UTC
verified in the trunk build 20071118
Comment 9 Vladimir Voskresensky 2007-11-19 14:02:16 UTC
integrated into release60:
Checking in impl/support/APTBaseMacroMap.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/impl/support/APTBaseMacroMap.java,v  <-- 
APTBaseMacroMap.java
new revision: 1.11.6.1; previous revision: 1.11
done
Checking in support/APTConditionResolver.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTConditionResolver.java,v  <-- 
APTConditionResolver.java
new revision: 1.3.8.1; previous revision: 1.3
done
Checking in support/APTExpandedStream.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTExpandedStream.java,v  <-- 
APTExpandedStream.java
new revision: 1.3.8.1; previous revision: 1.3
done
Checking in utils/APTUtils.java;
/shared/data/ccvs/repository/cnd/apt/src/org/netbeans/modules/cnd/apt/utils/APTUtils.java,v  <--  APTUtils.java
new revision: 1.15.2.1; previous revision: 1.15
done
Comment 10 Alexander Pepin 2007-11-21 10:53:15 UTC
verified in RC2 build (200711201000)