]> granicus.if.org Git - clang/commitdiff
[OPENCL] Fix wrongly vla error for OpenCL array.
authorXiuli Pan <xiulipan@outlook.com>
Tue, 7 Jun 2016 03:13:39 +0000 (03:13 +0000)
committerXiuli Pan <xiulipan@outlook.com>
Tue, 7 Jun 2016 03:13:39 +0000 (03:13 +0000)
Summary:
OpenCL should support array with const value size length, those const varibale in global and constant address space and variable in constant address space.

Reviewers: Anastasia, yaxunl, bader

Subscribers: bader, cfe-commits

Differential Revision: http://reviews.llvm.org/D20090

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

lib/AST/ExprConstant.cpp
lib/Sema/SemaType.cpp
test/CodeGenOpenCL/vla.cl [new file with mode: 0644]

index 8c24b0333e1f4762bb219a7de599232c9b4e179b..e14330cf60e78774abd7c421b3b917216483260a 100644 (file)
@@ -2745,7 +2745,10 @@ static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E,
       } else if (VD->isConstexpr()) {
         // OK, we can read this variable.
       } else if (BaseType->isIntegralOrEnumerationType()) {
-        if (!BaseType.isConstQualified()) {
+        // In OpenCL if a variable is in constant address space it is a const value.
+        if (!(BaseType.isConstQualified() ||
+              (Info.getLangOpts().OpenCL &&
+               BaseType.getAddressSpace() == LangAS::opencl_constant))) {
           if (Info.getLangOpts().CPlusPlus) {
             Info.Diag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD;
             Info.Note(VD->getLocation(), diag::note_declared_at);
index 9786f7fb4f8ae0b7cc59cc1af38b17fea6e86a96..ddcdef843100e550ced993c7f66b4a106bdd876d 100644 (file)
@@ -2063,7 +2063,8 @@ static bool isArraySizeVLA(Sema &S, Expr *ArraySize, llvm::APSInt &SizeVal) {
   } Diagnoser;
 
   return S.VerifyIntegerConstantExpression(ArraySize, &SizeVal, Diagnoser,
-                                           S.LangOpts.GNUMode).isInvalid();
+                                           S.LangOpts.GNUMode ||
+                                           S.LangOpts.OpenCL).isInvalid();
 }
 
 /// \brief Build an array type.
diff --git a/test/CodeGenOpenCL/vla.cl b/test/CodeGenOpenCL/vla.cl
new file mode 100644 (file)
index 0000000..56533ab
--- /dev/null
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s
+
+constant int sz0 = 5;
+// CHECK: @sz0 = constant i32 5, align 4
+const global int sz1 = 16;
+// CHECK: @sz1 = constant i32 16, align 4
+const constant int sz2 = 8;
+// CHECK: @sz2 = constant i32 8, align 4
+// CHECK: @testvla.vla2 = internal global [8 x i16] undef, align 16
+
+kernel void testvla()
+{
+  int vla0[sz0];
+// CHECK: %vla0 = alloca [5 x i32], align 16
+  char vla1[sz1];
+// CHECK: %vla1 = alloca [16 x i8], align 16
+  local short vla2[sz2];
+}