74 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks -std=c++1y
 | 
						|
 | 
						|
extern "C" int exit(int);
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    unsigned long ps[30];
 | 
						|
    int qs[30];
 | 
						|
} BobTheStruct;
 | 
						|
 | 
						|
int main (int argc, const char * argv[]) {
 | 
						|
    BobTheStruct inny;
 | 
						|
    BobTheStruct outty;
 | 
						|
    BobTheStruct (^copyStruct)(BobTheStruct);
 | 
						|
    int i;
 | 
						|
    
 | 
						|
    for(i=0; i<30; i++) {
 | 
						|
        inny.ps[i] = i * i * i;
 | 
						|
        inny.qs[i] = -i * i * i;
 | 
						|
    }
 | 
						|
    
 | 
						|
    copyStruct = ^(BobTheStruct aBigStruct){ return aBigStruct; };  // pass-by-value intrinsically copies the argument
 | 
						|
    
 | 
						|
    outty = copyStruct(inny);
 | 
						|
 | 
						|
    if ( &inny == &outty ) {
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
    for(i=0; i<30; i++) {
 | 
						|
        if ( (inny.ps[i] != outty.ps[i]) || (inny.qs[i] != outty.qs[i]) ) {
 | 
						|
            exit(1);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
namespace rdar8134521 {
 | 
						|
  void foo() {
 | 
						|
    int (^P)(int) = reinterpret_cast<int(^)(int)>(1);
 | 
						|
    P = (int(^)(int))(1);
 | 
						|
    
 | 
						|
    P = reinterpret_cast<int(^)(int)>((void*)1);
 | 
						|
    P = (int(^)(int))((void*)1);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace rdar11055105 {
 | 
						|
  struct A {
 | 
						|
    void foo();
 | 
						|
  };
 | 
						|
 | 
						|
  template <class T> void foo(T &x) noexcept(noexcept(x.foo()));
 | 
						|
 | 
						|
  void (^block)() = ^{
 | 
						|
    A a;
 | 
						|
    foo(a);
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
namespace LocalDecls {
 | 
						|
  void f() {
 | 
						|
    (void) ^{
 | 
						|
      extern int a; // expected-note {{previous}}
 | 
						|
      extern int b(); // expected-note {{previous}}
 | 
						|
    };
 | 
						|
  }
 | 
						|
  void g() {
 | 
						|
    (void) ^{
 | 
						|
      extern float a; // expected-error {{different type}}
 | 
						|
      extern float b(); // expected-error {{cannot be overloaded}}
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 |