with __unknown_anytype return type.
When the following code is compiled, Sema infers that the type of
__unknown_anytype is double:
extern __unknown_anytype func();
double *d = (double*)&func();
This triggers an assert in CodeGenFunction::EmitCallExprLValue because
it doesn't expect to see a call to a function with a non-reference
scalar return type.
This commit prevents the assert by making VisitUnaryAddrOf error out if
the address-of operator is applied to a call to a function with
__unknown_anytype return type.
rdar://problem/
20287610
Differential revision: https://reviews.llvm.org/D26808
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@287410
91177308-0d34-0410-b5e6-
96231b3b80d8
def err_unknown_any_addrof : Error<
"the address of a declaration with unknown type "
"can only be cast to a pointer type">;
+def err_unknown_any_addrof_call : Error<
+ "address-of operator cannot be applied to a call to a function with "
+ "unknown return 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<
<< E->getSourceRange();
return ExprError();
}
+
+ if (isa<CallExpr>(E->getSubExpr())) {
+ S.Diag(E->getOperatorLoc(), diag::err_unknown_any_addrof_call)
+ << E->getSourceRange();
+ return ExprError();
+ }
+
assert(E->getValueKind() == VK_RValue);
assert(E->getObjectKind() == OK_Ordinary);
E->setType(DestType);
(X<int>)test0(); // expected-error{{implicit instantiation of undefined template 'test5::X<int>'}}
}
}
+
+namespace test6 {
+ extern __unknown_anytype func();
+ extern __unknown_anytype var;
+ double *d;
+
+ void test() {
+ d = (double*)&func(); // expected-error{{address-of operator cannot be applied to a call to a function with unknown return type}}
+ d = (double*)&var;
+ }
+
+}