[OPENMP] Fix for PR34321: ustom OpenMP reduction in C++ template causes

SEGFAULT at compile time

Compiler crashed when tried to rebuild non-template expression in
dependent context.

llvm-svn: 311777
This commit is contained in:
Alexey Bataev 2017-08-25 15:43:55 +00:00
parent 780b462840
commit fdc2035373
2 changed files with 20 additions and 1 deletions

View File

@ -9057,7 +9057,8 @@ buildDeclareReductionRef(Sema &SemaRef, SourceLocation Loc, SourceRange Range,
PrevD = D;
}
}
if (Ty->isDependentType() || Ty->isInstantiationDependentType() ||
if (SemaRef.CurContext->isDependentContext() || Ty->isDependentType() ||
Ty->isInstantiationDependentType() ||
Ty->containsUnexpandedParameterPack() ||
filterLookupForUDR<bool>(Lookups, [](ValueDecl *D) -> bool {
return !D->isInvalidDecl() &&

View File

@ -92,6 +92,22 @@ T foo(T a) {
return a;
}
struct Summary {
void merge(const Summary& other) {}
};
template <typename K>
void work() {
Summary global_summary;
#pragma omp declare reduction(+ : Summary : omp_out.merge(omp_in))
#pragma omp parallel for reduction(+ : global_summary)
for (int k = 1; k <= 100; ++k) {
}
}
struct A {};
// CHECK-LABEL: @main
int main() {
int i = 0;
@ -110,6 +126,8 @@ int main() {
// CHECK: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
// CHECK: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
// CHECK: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call({{[^@]*}} @{{[^@]*}}[[REGION:@[^ ]+]]
// CHECK-LABEL: work
work<A>();
// CHECK-LABEL: foo
return foo(15);
}