Skip to content

Commit

Permalink
[OPENCL] Fix wrongly vla error for OpenCL array.
Browse files Browse the repository at this point in the history
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

llvm-svn: 271971
  • Loading branch information
xiulipan committed Jun 7, 2016
1 parent c7afda5 commit bdfbaaa
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
5 changes: 4 additions & 1 deletion clang/lib/AST/ExprConstant.cpp
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaType.cpp
Expand Up @@ -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.
Expand Down
18 changes: 18 additions & 0 deletions clang/test/CodeGenOpenCL/vla.cl
@@ -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];
}

0 comments on commit bdfbaaa

Please sign in to comment.