186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// The LLVM Compiler Infrastructure 386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source 586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details. 686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// -*- mode:C; c-basic-offset:4; tab-width:4; intent-tabs-mode:nil; -*- 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdio.h> 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdlib.h> 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <string.h> 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garsttypedef struct { 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int a; 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int b; 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} MiniStruct; 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main (int argc, const char * argv[]) { 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst MiniStruct inny; 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst MiniStruct outty; 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst MiniStruct (^copyStruct)(MiniStruct); 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst memset(&inny, 0xA5, sizeof(inny)); 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst memset(&outty, 0x2A, sizeof(outty)); 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst inny.a = 12; 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst inny.b = 42; 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst copyStruct = ^(MiniStruct aTinyStruct){ return aTinyStruct; }; // pass-by-value intrinsically copies the argument 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst outty = copyStruct(inny); 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if ( &inny == &outty ) { 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: struct wasn't copied.", argv[0]); 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(1); 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if ( (inny.a != outty.a) || (inny.b != outty.b) ) { 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: struct contents did not match.", argv[0]); 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst exit(1); 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: success\n", argv[0]); 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 0; 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 46