From mboxrd@z Thu Jan 1 00:00:00 1970 From: Aldy Hernandez To: "Joseph S. Myers" Cc: Jakub Jelinek , Subject: Re: new __builtin_choose_type (patch) (new builtin_equal_types patch) Date: Sun, 07 Oct 2001 16:56:00 -0000 Message-id: References: X-SW-Source: 2001-10/msg00524.html >>>>> "Joseph" == Joseph S Myers writes: Ok, sorry for the delay. > __builtin_choose_expr (C, E1, E2) - returns E1 (and has the type of E1) if > C is true, otherwise returns E2 (and has the type of E2). C must be an > integer constant expression. So C is a constant? If so, is the following patch what is needed for __buildin_choose_expr? Cheers. Aldy 2001-10-07 Aldy Hernandez * c-common.h (rid): Add RID_CHOOSE_EXPR. * c-parse.in (reswords): Add __builtin_choose_expr. Add CHOOSE_EXPR token. Add production for CHOOSE_EXPR. Index: c-parse.in =================================================================== RCS file: /cvs/gcc/egcs/gcc/c-parse.in,v retrieving revision 1.106 diff -c -p -r1.106 c-parse.in *** c-parse.in 2001/09/21 01:26:52 1.106 --- c-parse.in 2001/10/07 23:55:27 *************** end ifc *** 121,127 **** %token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF %token ATTRIBUTE EXTENSION LABEL ! %token REALPART IMAGPART VA_ARG %token PTR_VALUE PTR_BASE PTR_EXTENT /* function name can be a string const or a var decl. */ --- 121,127 ---- %token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF %token ATTRIBUTE EXTENSION LABEL ! %token REALPART IMAGPART VA_ARG CHOOSE_EXPR %token PTR_VALUE PTR_BASE PTR_EXTENT /* function name can be a string const or a var decl. */ *************** primary: *** 710,715 **** --- 710,717 ---- { $$ = build_function_call ($1, $3); } | VA_ARG '(' expr_no_commas ',' typename ')' { $$ = build_va_arg ($3, groktypename ($5)); } + | CHOOSE_EXPR '(' CONSTANT ',' expr_no_commas ',' expr_no_commas ')' + { $$ = integer_zerop ($3) ? $7 : $5; } | primary '[' expr ']' %prec '.' { $$ = build_array_ref ($1, $3); } | primary '.' identifier *************** static const struct resword reswords[] = *** 3290,3295 **** --- 3292,3298 ---- { "__attribute__", RID_ATTRIBUTE, 0 }, { "__bounded", RID_BOUNDED, 0 }, { "__bounded__", RID_BOUNDED, 0 }, + { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 }, { "__builtin_va_arg", RID_VA_ARG, 0 }, { "__complex", RID_COMPLEX, 0 }, { "__complex__", RID_COMPLEX, 0 }, *************** static const short rid_to_yy[RID_MAX] = *** 3461,3466 **** --- 3464,3470 ---- /* RID_PTRBASE */ PTR_BASE, /* RID_PTREXTENT */ PTR_EXTENT, /* RID_PTRVALUE */ PTR_VALUE, + /* RID_CHOOSE_EXPR */ CHOOSE_EXPR, /* RID_FUNCTION_NAME */ STRING_FUNC_NAME, /* RID_PRETTY_FUNCTION_NAME */ STRING_FUNC_NAME, Index: c-common.h =================================================================== RCS file: /cvs/gcc/egcs/gcc/c-common.h,v retrieving revision 1.85 diff -c -p -r1.85 c-common.h *** c-common.h 2001/09/22 13:14:34 1.85 --- c-common.h 2001/10/07 23:55:27 *************** enum rid *** 74,80 **** /* C extensions */ RID_ASM, RID_TYPEOF, RID_ALIGNOF, RID_ATTRIBUTE, RID_VA_ARG, RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_PTRBASE, ! RID_PTREXTENT, RID_PTRVALUE, /* Too many ways of getting the name of a function as a string */ RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME, --- 74,80 ---- /* C extensions */ RID_ASM, RID_TYPEOF, RID_ALIGNOF, RID_ATTRIBUTE, RID_VA_ARG, RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_PTRBASE, ! RID_PTREXTENT, RID_PTRVALUE, RID_CHOOSE_EXPR, /* Too many ways of getting the name of a function as a string */ RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME,