forked from OSchip/llvm-project
Add support for CallExpr::isBuiltinConstantExpr(). For now, this hook is used to support CFConstantStrings. Can be extended to support other built-in functions.
This allows the following code to compile without error... #include <CoreFoundation/CoreFoundation.h> #define CONST_STRING_DECL(S, V) const CFStringRef S = (const CFStringRef)__builtin___CFStringMakeConstantString(V); CONST_STRING_DECL(kCFTimeZoneSystemTimeZoneDidChangeNotification, "kCFTimeZoneSystemTimeZoneDidChangeNotification") llvm-svn: 46592
This commit is contained in:
parent
a65951fef0
commit
f6e3b32964
|
@ -118,6 +118,24 @@ void CallExpr::setNumArgs(unsigned NumArgs) {
|
|||
this->NumArgs = NumArgs;
|
||||
}
|
||||
|
||||
bool CallExpr::isBuiltinConstantExpr() const {
|
||||
// All simple function calls (e.g. func()) are implicitly cast to pointer to
|
||||
// function. As a result, we try and obtain the DeclRefExpr from the
|
||||
// ImplicitCastExpr.
|
||||
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
|
||||
if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
|
||||
return false;
|
||||
|
||||
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
|
||||
if (!DRE)
|
||||
return false;
|
||||
|
||||
// We have a DeclRefExpr.
|
||||
if (strcmp(DRE->getDecl()->getName(),
|
||||
"__builtin___CFStringMakeConstantString") == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CallExpr::isBuiltinClassifyType(llvm::APSInt &Result) const {
|
||||
// The following enum mimics gcc's internal "typeclass.h" file.
|
||||
|
@ -471,6 +489,8 @@ bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {
|
|||
static_cast<uint32_t>(Ctx.getTypeSize(getType(), CE->getLocStart())));
|
||||
if (CE->isBuiltinClassifyType(Result))
|
||||
return true;
|
||||
if (CE->isBuiltinConstantExpr())
|
||||
return true;
|
||||
if (Loc) *Loc = getLocStart();
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -620,6 +620,9 @@ public:
|
|||
unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; }
|
||||
|
||||
bool isBuiltinClassifyType(llvm::APSInt &Result) const;
|
||||
|
||||
/// isBuiltinConstantExpr - Return true if this built-in call is constant.
|
||||
bool isBuiltinConstantExpr() const;
|
||||
|
||||
SourceLocation getRParenLoc() const { return RParenLoc; }
|
||||
SourceRange getSourceRange() const {
|
||||
|
|
Loading…
Reference in New Issue