From: Steve Naroff Date: Thu, 31 Jan 2008 01:07:12 +0000 (+0000) Subject: Add support for CallExpr::isBuiltinConstantExpr(). For now, this hook is used to... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c4f8e8b645b8e0e685c089dde0674c6f29a24168;p=clang 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 #define CONST_STRING_DECL(S, V) const CFStringRef S = (const CFStringRef)__builtin___CFStringMakeConstantString(V); CONST_STRING_DECL(kCFTimeZoneSystemTimeZoneDidChangeNotification, "kCFTimeZoneSystemTimeZoneDidChangeNotification") git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46592 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index e209db35ff..88c1b236e8 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -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(getCallee()); + if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). + return false; + + const DeclRefExpr *DRE = dyn_cast(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(Ctx.getTypeSize(getType(), CE->getLocStart()))); if (CE->isBuiltinClassifyType(Result)) return true; + if (CE->isBuiltinConstantExpr()) + return true; if (Loc) *Loc = getLocStart(); return false; } diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 820289976d..6e8c7c6e91 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -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 {