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/*
886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  variadic.c
986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  testObjects
1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *
1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *  Created by Blaine Garst on 2/17/09.
1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst *
1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst */
1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// PURPOSE Test that variadic arguments compile and work for Blocks
1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG
1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdarg.h>
1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdio.h>
2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) {
2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    long (^addthem)(const char *, ...) = ^long (const char *format, ...){
2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        va_list argp;
2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        const char *p;
2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        int i;
2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        char c;
2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        double d;
2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        long result = 0;
3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        va_start(argp, format);
3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        //printf("starting...\n");
3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        for (p = format; *p; p++) switch (*p) {
3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst            case 'i':
3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                i = va_arg(argp, int);
3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                //printf("i: %d\n", i);
3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                result += i;
3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                break;
3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst            case 'd':
3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                d = va_arg(argp, double);
4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                //printf("d: %g\n", d);
4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                result += (int)d;
4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                break;
4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst            case 'c':
4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                c = va_arg(argp, int);
4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                //printf("c: '%c'\n", c);
4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                result += c;
4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst                break;
4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        }
4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        //printf("...done\n\n");
5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        return result;
5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    };
5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    long testresult = addthem("ii", 10, 20);
5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    if (testresult != 30) {
5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        printf("got wrong result: %ld\n", testresult);
5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        return 1;
5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    testresult = addthem("idc", 30, 40.0, 'a');
5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    if (testresult != (70+'a')) {
5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        printf("got different wrong result: %ld\n", testresult);
6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        return 1;
6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    printf("%s: Success\n", argv[0]);
6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    return 0;
6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
67