<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Hi, 'if' etc. clauses are correct, 'map' etc are not. I'll fix
that, thanks for the report.<br>
</p>
<pre class="moz-signature" cols="72">-------------
Best regards,
Alexey Bataev</pre>
<div class="moz-cite-prefix">05.07.2018 10:53, Cramer, Tim via
cfe-dev пишет:<br>
</div>
<blockquote type="cite"
cite="mid:%3C5f20e4214c8e47fd919eb701184dbad8@itc.rwth-aachen.de%3E">
<pre wrap="">Hello everybody,
I have question regarding the source location of an OpenMP clause. Given the following code:
int main() {
int n = 42;
int m = 23;
float f = 42.23;
#pragma omp target parallel map(n) num_threads(2) if(1) shared(n,m) private(f) default(shared) proc_bind(spread)
{
f = n / m;
}
return 0;
}
I get the following AST (snippet):
|-OMPTargetParallelDirective 0x77aaf0 <line:6:11, col:116>
| |-OMPMapClause 0x7643a0 <col:31, col:38>
| | `-DeclRefExpr 0x764378 <col:35> 'int' lvalue Var 0x764168 'n' 'int'
| |-OMPNum_threadsClause 0x764420 <col:38, col:51>
| | `-IntegerLiteral 0x764400 <col:50> 'int' 2
| |-OMPIfClause 0x764468 <col:53, col:57>
| | `-IntegerLiteral 0x764448 <col:56> 'int' 1
| |-OMPSharedClause 0x7644f0 <col:59, col:71>
| | |-DeclRefExpr 0x7644a0 <col:66> 'int' lvalue Var 0x764168 'n' 'int'
| | `-DeclRefExpr 0x7644c8 <col:68> 'int' lvalue Var 0x764218 'm' 'int'
| |-OMPPrivateClause 0x7645e0 <col:71, col:83>
| | `-DeclRefExpr 0x764518 <col:79> 'float' lvalue Var 0x7642c8 'f' 'float'
| |-OMPDefaultClause 0x764608 <col:83, col:99>
| |-OMPProc_bindClause 0x764620 <col:99, col:116>
As you can see, the end of the clauses 'map', 'num_threads', 'shared', 'private' point just before the start of the next token (clause). In contrast, the end of the clauses 'if', 'default' and 'proc_bind' points just before the right paren. The problem is that "clang::OMPClause::getLocEnd()" returns different locations, depending on the clause kind. I guess this does not look like intended.
My question is: Where should "clang::OMPClause::getLocEnd()" point to? After or before the left paren?
A quick look into "lib/Parse/ParseOpenMP.cpp" shows that in one case "Tok.getLocation()" is used and in the other cases "T.getCloseLocation()". What is correct?
Best regards,
Tim Cramer
</pre>
</blockquote>
<br>
</body>
</html>