49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -triple x86_64 -verify=expected,dev -std=c++11\
 | 
						|
// RUN:            -verify-ignore-unexpected=note \
 | 
						|
// RUN:            -fopenmp -fopenmp-version=45 -o - %s
 | 
						|
 | 
						|
// RUN: %clang_cc1 -triple x86_64 -verify=expected,dev -std=c++11\
 | 
						|
// RUN:            -verify-ignore-unexpected=note \
 | 
						|
// RUN:            -fopenmp -o - %s
 | 
						|
 | 
						|
// Test no infinite recursion in DeferredDiagnosticEmitter.
 | 
						|
constexpr int foo(int *x) {
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int a = foo(&a);
 | 
						|
 | 
						|
// Test no crash when both caller and callee have target directives.
 | 
						|
int foo();
 | 
						|
 | 
						|
class B {
 | 
						|
public:
 | 
						|
  void barB(int *isHost) {
 | 
						|
  #pragma omp target map(tofrom: isHost)
 | 
						|
     {
 | 
						|
       *isHost = foo();
 | 
						|
     }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
class A : public B {
 | 
						|
public:
 | 
						|
  void barA(int *isHost) {
 | 
						|
  #pragma omp target map(tofrom: isHost)
 | 
						|
     {
 | 
						|
       barB(isHost);
 | 
						|
     }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
// Test that deleting an incomplete class type doesn't cause an assertion.
 | 
						|
namespace TestDeleteIncompleteClassDefinition {
 | 
						|
struct a;
 | 
						|
struct b {
 | 
						|
  b() {
 | 
						|
    delete c; // expected-warning {{deleting pointer to incomplete type 'TestDeleteIncompleteClassDefinition::a' may cause undefined behavior}}
 | 
						|
  }
 | 
						|
  a *c;
 | 
						|
};
 | 
						|
} // namespace TestDeleteIncompleteClassDefinition
 |