aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-08-10 04:12:23 +0000
committerJohn McCall <rjmccall@apple.com>2011-08-10 04:12:23 +0000
commita19950edd94c1b80e73c9f45d821b125bd0ee72f (patch)
treef83d1f0b3455212c3673400eddeb8940ed59c10b /lib/Sema/SemaExpr.cpp
parente7d002041dc60521f237b4219fd4167d1fe67aa7 (diff)
Change an assert into a check. I'm pretty sure there was a point
in time when this assert was valid, but it's not valid now. Also teach this code to correctly introduce function-to-pointer decay. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137201 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r--lib/Sema/SemaExpr.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 2814004b0b..f55a6babd8 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -9819,9 +9819,19 @@ ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *expr, ValueDecl *decl) {
// - functions
if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) {
- // This is true because FunctionDecls must always have function
- // type, so we can't be resolving the entire thing at once.
- assert(type->isFunctionType());
+ if (const PointerType *ptr = type->getAs<PointerType>()) {
+ DestType = ptr->getPointeeType();
+ ExprResult result = resolveDecl(expr, decl);
+ if (result.isInvalid()) return ExprError();
+ return S.ImpCastExprToType(result.take(), type,
+ CK_FunctionToPointerDecay, VK_RValue);
+ }
+
+ if (!type->isFunctionType()) {
+ S.Diag(expr->getExprLoc(), diag::err_unknown_any_function)
+ << decl << expr->getSourceRange();
+ return ExprError();
+ }
if (CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(fn))
if (method->isInstance()) {