2015-05-20 12:24:19 +08:00
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s
2014-07-11 19:25:16 +08:00
2017-12-30 02:07:07 +08:00
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s
2014-07-11 19:25:16 +08:00
void foo ( ) {
}
# pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}}
2014-10-08 22:01:46 +08:00
class S {
2015-08-18 14:47:21 +08:00
S ( const S & s ) { a = s . a + 12 ; } // expected-note 10 {{implicitly declared private here}}
2014-07-11 19:25:16 +08:00
int a ;
public :
S ( ) : a ( 0 ) { }
S ( int a ) : a ( a ) { }
operator int ( ) { return a ; }
S & operator + + ( ) { return * this ; }
S operator + ( const S & ) { return * this ; }
} ;
2014-10-08 22:01:46 +08:00
class S1 {
int a ;
public :
S1 ( ) : a ( 0 ) { }
S1 & operator + + ( ) { return * this ; }
S1 ( const S1 & ) = delete ; // expected-note 2 {{'S1' has been explicitly marked deleted here}}
} ;
2014-07-11 19:25:16 +08:00
template < class T >
int foo ( ) {
2014-10-08 22:01:46 +08:00
T a ;
2015-08-18 14:47:21 +08:00
T & b = a ;
2014-07-11 19:25:16 +08:00
int r ;
2014-10-08 22:01:46 +08:00
S1 s1 ;
// expected-error@+1 2 {{call to deleted constructor of 'S1'}}
# pragma omp task
// expected-note@+1 2 {{predetermined as a firstprivate in a task construct here}}
+ + s1 ;
2014-07-11 19:25:16 +08:00
# pragma omp task default(none)
# pragma omp task default(shared)
+ + a ;
# pragma omp task default(none)
# pragma omp task
2014-10-08 22:01:46 +08:00
// expected-error@+1 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
+ + a ;
# pragma omp task
# pragma omp task
2014-10-08 22:01:46 +08:00
// expected-error@+1 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
+ + a ;
# pragma omp task default(shared)
# pragma omp task
+ + a ;
# pragma omp task
# pragma omp parallel
+ + a ;
2015-08-18 14:47:21 +08:00
// expected-error@+2 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
# pragma omp task
+ + b ;
# pragma omp task
2015-08-18 14:47:21 +08:00
// expected-error@+1 2 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
# pragma omp parallel shared(a, b)
+ + a , + + b ;
2016-03-17 18:19:46 +08:00
// expected-note@+1 2 {{defined as reduction}}
2014-07-11 19:25:16 +08:00
# pragma omp parallel reduction(+ : r)
2016-03-17 18:19:46 +08:00
// expected-error@+1 2 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
2014-07-11 19:25:16 +08:00
# pragma omp task firstprivate(r)
+ + r ;
// expected-note@+1 2 {{defined as reduction}}
# pragma omp parallel reduction(+ : r)
# pragma omp task default(shared)
// expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
// expected-note@+1 2 {{defined as reduction}}
# pragma omp parallel reduction(+ : r)
# pragma omp task
// expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
# pragma omp parallel
2016-03-17 18:19:46 +08:00
// expected-note@+1 2 {{defined as reduction}}
2014-07-11 19:25:16 +08:00
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
2016-03-17 18:19:46 +08:00
// expected-error@+1 2 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}}
2014-07-11 19:25:16 +08:00
# pragma omp task firstprivate(r)
+ + r ;
# pragma omp parallel
// expected-note@+1 2 {{defined as reduction}}
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
# pragma omp task default(shared)
// expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
# pragma omp parallel
// expected-note@+1 2 {{defined as reduction}}
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
# pragma omp task
// expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
// expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
# pragma omp task
// expected-error@+2 {{reduction variable must be shared}}
// expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
# pragma omp for reduction(+ : r)
+ + r ;
2014-07-17 20:19:31 +08:00
// expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
# pragma omp task untied untied
+ + r ;
2014-07-17 20:47:03 +08:00
// expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
# pragma omp task mergeable mergeable
+ + r ;
2014-07-11 19:25:16 +08:00
return a + b ;
}
int main ( int argc , char * * argv ) {
int a ;
2015-08-18 14:47:21 +08:00
int & b = a ;
2014-10-08 22:01:46 +08:00
S sa ;
2015-08-18 14:47:21 +08:00
S & sb = sa ;
2014-07-11 19:25:16 +08:00
int r ;
# pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task[ // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task] // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task } // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo ( ) ;
# pragma omp task
// expected-warning@+1 {{extra tokens at the end of '#pragma omp task' are ignored}}
# pragma omp task unknown()
foo ( ) ;
L1 :
foo ( ) ;
# pragma omp task
;
# pragma omp task
{
goto L1 ; // expected-error {{use of undeclared label 'L1'}}
argc + + ;
}
for ( int i = 0 ; i < 10 ; + + i ) {
switch ( argc ) {
case ( 0 ) :
# pragma omp task
{
foo ( ) ;
break ; // expected-error {{'break' statement not in loop or switch statement}}
continue ; // expected-error {{'continue' statement not in loop statement}}
}
default :
break ;
}
}
# pragma omp task default(none)
+ + argc ; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
goto L2 ; // expected-error {{use of undeclared label 'L2'}}
# pragma omp task
L2 :
foo ( ) ;
# pragma omp task
{
return 1 ; // expected-error {{cannot return from OpenMP region}}
}
[ [ ] ] // expected-error {{an attribute list cannot appear here}}
# pragma omp task
for ( int n = 0 ; n < 100 ; + + n ) {
}
# pragma omp task default(none)
# pragma omp task default(shared)
+ + a ;
# pragma omp task default(none)
# pragma omp task
+ + a ;
# pragma omp task default(shared)
# pragma omp task
+ + a ;
# pragma omp task
# pragma omp parallel
+ + a ;
# pragma omp task
+ + b ;
# pragma omp task
# pragma omp parallel shared(a, b)
+ + a , + + b ;
# pragma omp task default(none)
# pragma omp task default(shared)
+ + sa ;
# pragma omp task default(none)
# pragma omp task
2014-10-08 22:01:46 +08:00
// expected-error@+1 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
+ + sa ;
# pragma omp task
# pragma omp task
2014-10-08 22:01:46 +08:00
// expected-error@+1 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
+ + sa ;
# pragma omp task default(shared)
# pragma omp task
+ + sa ;
# pragma omp task
# pragma omp parallel
+ + sa ;
2015-08-18 14:47:21 +08:00
// expected-error@+2 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
# pragma omp task
+ + sb ;
2015-08-18 14:47:21 +08:00
// expected-error@+2 2 {{calling a private constructor of class 'S'}}
2014-07-11 19:25:16 +08:00
# pragma omp task
# pragma omp parallel shared(sa, sb)
+ + sa , + + sb ;
// expected-note@+1 2 {{defined as reduction}}
# pragma omp parallel reduction(+ : r)
// expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
# pragma omp task firstprivate(r)
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
// expected-note@+1 {{defined as reduction}}
# pragma omp parallel reduction(+ : r)
# pragma omp task default(shared)
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
// expected-note@+1 {{defined as reduction}}
# pragma omp parallel reduction(+ : r)
# pragma omp task
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
# pragma omp parallel
// expected-note@+1 2 {{defined as reduction}}
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
// expected-error@+1 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}}
# pragma omp task firstprivate(r)
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
# pragma omp parallel
// expected-note@+1 {{defined as reduction}}
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
# pragma omp task default(shared)
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
# pragma omp parallel
// expected-note@+1 {{defined as reduction}}
# pragma omp for reduction(+ : r)
for ( int i = 0 ; i < 10 ; + + i )
# pragma omp task
// expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
+ + r ;
// expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
# pragma omp task
// expected-error@+2 {{reduction variable must be shared}}
// expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
# pragma omp for reduction(+ : r)
+ + r ;
2014-07-17 20:19:31 +08:00
// expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
# pragma omp task untied untied
+ + r ;
2014-07-17 20:47:03 +08:00
// expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
# pragma omp task mergeable mergeable
+ + r ;
2014-07-11 19:25:16 +08:00
// expected-note@+2 {{in instantiation of function template specialization 'foo<int>' requested here}}
// expected-note@+1 {{in instantiation of function template specialization 'foo<S>' requested here}}
return foo < int > ( ) + foo < S > ( ) ;
}