From f7d563c76c40acc361417ec1bdef6f15739516e4 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Sat, 19 Nov 2016 00:13:03 +0000 Subject: [Sema] Don't allow applying address-of operator to a call to a function 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 llvm-svn: 287410 --- clang/lib/Sema/SemaExpr.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'clang/lib/Sema') diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index fae8bf0f548..9d0d55e6876 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -14774,6 +14774,13 @@ namespace { << E->getSourceRange(); return ExprError(); } + + if (isa(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); -- cgit v1.2.3