]> granicus.if.org Git - clang/commitdiff
[OpenCL] Ignore parentheses for sampler initialization
authorSven van Haastregt <sven.vanhaastregt@arm.com>
Mon, 12 Aug 2019 12:44:26 +0000 (12:44 +0000)
committerSven van Haastregt <sven.vanhaastregt@arm.com>
Mon, 12 Aug 2019 12:44:26 +0000 (12:44 +0000)
The sampler handling logic in SemaInit.cpp would inadvertently treat
parentheses around sampler arguments as an implicit cast, leading to
an unreachable "can't implicitly cast lvalue to rvalue with
this cast kind".  Fix by ignoring parentheses once we are in the
sampler initializer case.

Differential Revision: https://reviews.llvm.org/D66080

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@368561 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/SemaOpenCL/sampler_t.cl

index 980696f4213b2176822b480e4f0239ce4821c502..2be4e897c8ee67e277bc4f74333e089cf8914f5c 100644 (file)
@@ -8248,7 +8248,7 @@ ExprResult InitializationSequence::Perform(Sema &S,
       // argument passing.
       assert(Step->Type->isSamplerT() &&
              "Sampler initialization on non-sampler type.");
-      Expr *Init = CurInit.get();
+      Expr *Init = CurInit.get()->IgnoreParens();
       QualType SourceType = Init->getType();
       // Case 1
       if (Entity.isParameterKind()) {
index 28e7a0ad27ecff5f95503aa2de58a271ccd9e4a0..fe9d997c896073d968d018d5d2137d36db3b93c7 100644 (file)
@@ -10,6 +10,9 @@
 #define CLK_FILTER_NEAREST              0x10
 #define CLK_FILTER_LINEAR               0x20
 
+typedef float float4 __attribute__((ext_vector_type(4)));
+float4 read_imagef(read_only image1d_t, sampler_t, float);
+
 constant sampler_t glb_smp = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR;
 constant sampler_t glb_smp2; // expected-error{{variable in constant address space must be initialized}}
 global sampler_t glb_smp3 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_NEAREST; // expected-error{{sampler type cannot be used with the __local and __global address space qualifiers}} expected-error {{global sampler requires a const or constant address space qualifier}}
@@ -74,3 +77,7 @@ void bar() {
   foo(smp1+1); //expected-error{{invalid operands to binary expression ('sampler_t' and 'int')}}
 }
 
+void smp_args(read_only image1d_t image) {
+  // Test that parentheses around sampler arguments are ignored.
+  float4 res = read_imagef(image, (glb_smp10), 0.0f);
+}