зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
e7d002041d
Коммит
a19950edd9
|
@ -4500,6 +4500,8 @@ def err_unknown_any_addrof : Error<
|
|||
"can only be cast to a pointer type">;
|
||||
def err_unknown_any_var_function_type : Error<
|
||||
"variable %0 with unknown type cannot be given a function type">;
|
||||
def err_unknown_any_function : Error<
|
||||
"function %0 with unknown type must be given a function type">;
|
||||
|
||||
def err_filter_expression_integral : Error<
|
||||
"filter expression type should be an integral value not %0">;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -34,3 +34,14 @@ namespace test3 {
|
|||
((void(void)) foo)(); // expected-error {{variable 'foo' with unknown type cannot be given a function type}}
|
||||
}
|
||||
}
|
||||
|
||||
// rdar://problem/9899447
|
||||
namespace test4 {
|
||||
extern __unknown_anytype test0(...);
|
||||
extern __unknown_anytype test1(...);
|
||||
|
||||
void test() {
|
||||
void (*fn)(int) = (void(*)(int)) test0;
|
||||
int x = (int) test1; // expected-error {{function 'test1' with unknown type must be given a function type}}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче