From 9cf080fba3bd8a72e119db43f8a05cf11ce709f0 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 18 Jan 2012 03:06:12 +0000 Subject: A call to strlen is not a constant expression, even if we're treating it as a builtin. llvm-svn: 148374 --- clang/lib/AST/ExprConstant.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'clang/lib/AST/ExprConstant.cpp') diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 1ad0bc5474b..fc3c5aac01c 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -3891,8 +3891,15 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { case Builtin::BI__builtin_expect: return Visit(E->getArg(0)); - + case Builtin::BIstrlen: + // A call to strlen is not a constant expression. + if (Info.getLangOpts().CPlusPlus0x) + Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_invalid_function) + << /*isConstexpr*/0 << /*isConstructor*/0 << "'strlen'"; + else + Info.CCEDiag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); + // Fall through. case Builtin::BI__builtin_strlen: // As an extension, we support strlen() and __builtin_strlen() as constant // expressions when the argument is a string literal. -- cgit v1.2.3