|
@@ -2424,6 +2424,7 @@ void InitializationSequence::Step::Destroy() {
|
|
case SK_PassByIndirectRestore:
|
|
case SK_PassByIndirectRestore:
|
|
case SK_ProduceObjCObject:
|
|
case SK_ProduceObjCObject:
|
|
case SK_StdInitializerList:
|
|
case SK_StdInitializerList:
|
|
|
|
+ case SK_OCLSamplerInit:
|
|
case SK_OCLZeroEvent:
|
|
case SK_OCLZeroEvent:
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -2653,6 +2654,13 @@ void InitializationSequence::AddStdInitializerListConstructionStep(QualType T) {
|
|
Steps.push_back(S);
|
|
Steps.push_back(S);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void InitializationSequence::AddOCLSamplerInitStep(QualType T) {
|
|
|
|
+ Step S;
|
|
|
|
+ S.Kind = SK_OCLSamplerInit;
|
|
|
|
+ S.Type = T;
|
|
|
|
+ Steps.push_back(S);
|
|
|
|
+}
|
|
|
|
+
|
|
void InitializationSequence::AddOCLZeroEventStep(QualType T) {
|
|
void InitializationSequence::AddOCLZeroEventStep(QualType T) {
|
|
Step S;
|
|
Step S;
|
|
S.Kind = SK_OCLZeroEvent;
|
|
S.Kind = SK_OCLZeroEvent;
|
|
@@ -4017,6 +4025,18 @@ static bool tryObjCWritebackConversion(Sema &S,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool TryOCLSamplerInitialization(Sema &S,
|
|
|
|
+ InitializationSequence &Sequence,
|
|
|
|
+ QualType DestType,
|
|
|
|
+ Expr *Initializer) {
|
|
|
|
+ if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
|
|
|
|
+ !Initializer->isIntegerConstantExpr(S.getASTContext()))
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ Sequence.AddOCLSamplerInitStep(DestType);
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
//
|
|
//
|
|
// OpenCL 1.2 spec, s6.12.10
|
|
// OpenCL 1.2 spec, s6.12.10
|
|
//
|
|
//
|
|
@@ -4180,7 +4200,9 @@ InitializationSequence::InitializationSequence(Sema &S,
|
|
tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
|
|
tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
|
|
|
|
+ return;
|
|
|
|
|
|
if (TryOCLZeroEventInitialization(S, *this, DestType, Initializer))
|
|
if (TryOCLZeroEventInitialization(S, *this, DestType, Initializer))
|
|
return;
|
|
return;
|
|
@@ -4974,6 +4996,7 @@ InitializationSequence::Perform(Sema &S,
|
|
case SK_PassByIndirectRestore:
|
|
case SK_PassByIndirectRestore:
|
|
case SK_ProduceObjCObject:
|
|
case SK_ProduceObjCObject:
|
|
case SK_StdInitializerList:
|
|
case SK_StdInitializerList:
|
|
|
|
+ case SK_OCLSamplerInit:
|
|
case SK_OCLZeroEvent: {
|
|
case SK_OCLZeroEvent: {
|
|
assert(Args.size() == 1);
|
|
assert(Args.size() == 1);
|
|
CurInit = Args[0];
|
|
CurInit = Args[0];
|
|
@@ -5490,6 +5513,23 @@ InitializationSequence::Perform(Sema &S,
|
|
CurInit = S.Owned(Semantic);
|
|
CurInit = S.Owned(Semantic);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ case SK_OCLSamplerInit: {
|
|
|
|
+ assert(Step->Type->isSamplerT() &&
|
|
|
|
+ "Sampler initialization on non sampler type.");
|
|
|
|
+
|
|
|
|
+ QualType SourceType = CurInit.get()->getType();
|
|
|
|
+ InitializedEntity::EntityKind EntityKind = Entity.getKind();
|
|
|
|
+
|
|
|
|
+ if (EntityKind == InitializedEntity::EK_Parameter) {
|
|
|
|
+ if (!SourceType->isSamplerT())
|
|
|
|
+ S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
|
|
|
|
+ << SourceType;
|
|
|
|
+ } else if (EntityKind != InitializedEntity::EK_Variable) {
|
|
|
|
+ llvm_unreachable("Invalid EntityKind!");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
case SK_OCLZeroEvent: {
|
|
case SK_OCLZeroEvent: {
|
|
assert(Step->Type->isEventT() &&
|
|
assert(Step->Type->isEventT() &&
|
|
"Event initialization on non event type.");
|
|
"Event initialization on non event type.");
|
|
@@ -6186,6 +6226,10 @@ void InitializationSequence::dump(raw_ostream &OS) const {
|
|
OS << "std::initializer_list from initializer list";
|
|
OS << "std::initializer_list from initializer list";
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case SK_OCLSamplerInit:
|
|
|
|
+ OS << "OpenCL sampler_t from integer constant";
|
|
|
|
+ break;
|
|
|
|
+
|
|
case SK_OCLZeroEvent:
|
|
case SK_OCLZeroEvent:
|
|
OS << "OpenCL event_t from zero";
|
|
OS << "OpenCL event_t from zero";
|
|
break;
|
|
break;
|