ERROR: 0:158: '#else' : #else after #else
ERROR: 0:160: '#endif' : unexpected tokens following directive
ERROR: 0:164: '#define' : duplicate macro parameter
-ERROR: 0:173: '#define' : Macro redefined; different number of arguments: m4
-ERROR: 0:178: '#define' : Macro redefined; different number of arguments: m5
-ERROR: 0:182: '#define' : Macro redefined; different number of arguments: m6
+ERROR: 0:173: '#define' : Macro redefined; function-like versus object-like: m4
+ERROR: 0:177: '#define' : Macro redefined; function-like versus object-like: m5
+ERROR: 0:181: '#define' : Macro redefined; different number of arguments: m6
ERROR: 0:185: '#define' : Macro redefined; different substitutions: m7
ERROR: 0:192: '#define' : Macro redefined; different substitutions: m8
ERROR: 0:196: '#define' : Macro redefined; different argument names: m9
// save the macro name
const int defAtom = atomStrings.getAddAtom(ppToken->name);
+ TSourceLoc defineLoc = ppToken->loc; // because ppToken might go to the next line before we report errors
// gather parameters to the macro, between (...)
token = scanToken(ppToken);
- if (token == '(' && ! ppToken->space) {
- mac.emptyArgs = 1;
+ if (token == '(' && !ppToken->space) {
+ mac.functionLike = 1;
do {
token = scanToken(ppToken);
if (mac.args.size() == 0 && token == ')')
return token;
}
- mac.emptyArgs = 0;
const int argAtom = atomStrings.getAddAtom(ppToken->name);
// check for duplication of parameter name
}
// record the definition of the macro
- TSourceLoc defineLoc = ppToken->loc; // because ppToken is going to go to the next line before we report errors
while (token != '\n' && token != EndOfInput) {
mac.body.putToken(token, ppToken);
token = scanToken(ppToken);
// Already defined -- need to make sure they are identical:
// "Two replacement lists are identical if and only if the preprocessing tokens in both have the same number,
// ordering, spelling, and white-space separation, where all white-space separations are considered identical."
- if (existing->args.size() != mac.args.size() || existing->emptyArgs != mac.emptyArgs)
+ if (existing->functionLike != mac.functionLike)
+ parseContext.ppError(defineLoc, "Macro redefined; function-like versus object-like:", "#define", atomStrings.getString(defAtom));
+ else if (existing->args.size() != mac.args.size())
parseContext.ppError(defineLoc, "Macro redefined; different number of arguments:", "#define", atomStrings.getString(defAtom));
else {
if (existing->args != mac.args)
TSourceLoc loc = ppToken->loc; // in case we go to the next line before discovering the error
in->mac = macro;
- if (macro->args.size() > 0 || macro->emptyArgs) {
+ if (macro->functionLike) {
int token = scanToken(ppToken);
if (newLineOkay) {
while (token == '\n')
token = scanToken(ppToken);
}
if (token != '(') {
+ // function-like macro called with object-like syntax: okay, don't expand
UngetToken(token, ppToken);
delete in;
return MacroExpandNotStarted;