[cfe-dev] Implicitly declared K&R parameters.
Enea Zaffanella
zaffanella at cs.unipr.it
Wed Sep 29 05:11:04 PDT 2010
Hello.
Consider the following K&R function definition:
void foo(implicit, explicit)
int explicit;
{}
While traversing the corresponding AST chunk, we would like to be able
to distinguish between parameter 'explicit' (which was explicitly
declared) from parameter 'implicit' (which was implicitly declared).
Is there a reliable way of distinguishing between the two cases?
First (failed) attempt:
Usually, implicit declarations are provided with an invalid source
location, but this is false for the case at hand: the location of the
identifier is obtained.
Second (failed) attempt:
Since 'implicit' has no type written, we also checked for an invalid
getTypeSpecStartLoc(), but again we obtained a valid location, which is
the same as that of the identifier. Here are the relevant source lines
in SemaDecl.cpp:
// Implicitly declare the argument as type 'int' for lack of a better
// type.
DeclSpec DS;
const char* PrevSpec; // unused
unsigned DiagID; // unused
DS.SetTypeSpecType(DeclSpec::TST_int, FTI.ArgInfo[i].IdentLoc,
PrevSpec, DiagID);
Third (maybe working) attempt:
We ended up checking whether or not the two source locations mentioned
above happen to be the same source location:
bool implicit = (param.getLocation() == param.getTypeSpecStartLoc());
This was working as expected on the few tests we tried.
However, we would like to avoid making wild guesses: is such a property
a valid (i.e., supported) clang invariant or is it just working by chance?
For clarity, would you accept the addition of a method
bool ParmVarDecl::isImplicitIntKNRParameter() const {
return getLocation() == getTypeSpecTypeLoc();
}
?
Regards,
Enea.
More information about the cfe-dev
mailing list