forked from OSchip/llvm-project
[OPENMP] Fixed DSA detecting for function parameters: by default they must be private.
llvm-svn: 213835
This commit is contained in:
parent
78bb36f159
commit
8b9cb9833f
|
@ -226,7 +226,7 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(StackTy::reverse_iterator Iter,
|
|||
// File-scope or namespace-scope variables referenced in called routines
|
||||
// in the region are shared unless they appear in a threadprivate
|
||||
// directive.
|
||||
if (!D->isFunctionOrMethodVarDecl())
|
||||
if (!D->isFunctionOrMethodVarDecl() && !isa<ParmVarDecl>(D))
|
||||
DVar.CKind = OMPC_shared;
|
||||
|
||||
// OpenMP [2.9.1.2, Data-sharing Attribute Rules for Variables Referenced
|
||||
|
@ -393,8 +393,10 @@ DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) {
|
|||
StartI = std::next(StartI);
|
||||
}
|
||||
if (!isParallelOrTaskRegion(Kind)) {
|
||||
if (isOpenMPLocal(D, StartI) && D->isLocalVarDecl() &&
|
||||
(D->getStorageClass() == SC_Auto || D->getStorageClass() == SC_None)) {
|
||||
if (isOpenMPLocal(D, StartI) &&
|
||||
((D->isLocalVarDecl() && (D->getStorageClass() == SC_Auto ||
|
||||
D->getStorageClass() == SC_None)) ||
|
||||
isa<ParmVarDecl>(D))) {
|
||||
DVar.CKind = OMPC_private;
|
||||
return DVar;
|
||||
}
|
||||
|
|
|
@ -155,3 +155,23 @@ int main(int argc, char **argv) {
|
|||
|
||||
return tmain(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char>' requested here}}
|
||||
}
|
||||
|
||||
extern void abort(void);
|
||||
|
||||
void
|
||||
single(int a, int b) {
|
||||
#pragma omp single copyprivate(a) copyprivate(b)
|
||||
{
|
||||
a = b = 5;
|
||||
}
|
||||
|
||||
if (a != b)
|
||||
abort();
|
||||
}
|
||||
|
||||
int parallel() {
|
||||
#pragma omp parallel
|
||||
single(1, 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue