diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4193,7 +4193,9 @@ case ICK_Lvalue_To_Rvalue: { assert(From->getObjectKind() != OK_ObjCProperty); ExprResult FromRes = DefaultLvalueConversion(From); - assert(!FromRes.isInvalid() && "Can't perform deduced conversion?!"); + if (FromRes.isInvalid()) + return ExprError(); + From = FromRes.get(); FromType = From->getType(); break; diff --git a/clang/test/SemaOpenCLCXX/half.clcpp b/clang/test/SemaOpenCLCXX/half.clcpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaOpenCLCXX/half.clcpp @@ -0,0 +1,15 @@ +//RUN: %clang_cc1 %s -triple spir -verify -fsyntax-only + +#pragma OPENCL EXTENSION cl_khr_fp16 : disable + +typedef half half2 __attribute__((ext_vector_type(2))); + +half f(half2 h2) { // expected-error{{declaring function return value of type 'half' is not allowed ; did you forget * ?}} + return h2.s0; // expected-error{{loading directly from pointer to type '__private half' requires cl_khr_fp16. Use vector data load builtin functions instead}} +} + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +half f(half2 h2) { + return h2.s0; +}