1 /* { dg-do compile } */
2 /* { dg-options "-O3 -std=c99 -mexplicit-relocs" } */
5 typedef unsigned int SEXPTYPE;
19 struct SEXPREC *carval;
20 struct SEXPREC *cdrval;
21 struct SEXPREC *tagval;
24 typedef struct SEXPREC
26 struct sxpinfo_struct sxpinfo;
29 struct listsxp_struct listsxp;
33 typedef struct VECTOR_SEXPREC
35 struct vecsxp_struct vecsxp;
36 } VECTOR_SEXPREC, *VECSEXP;
44 extern SEXP R_NilValue;
45 extern SEXP R_MissingArg;
47 int Rf_envlength (SEXP rho);
48 SEXP Rf_protect (SEXP);
49 const char *Rf_translateChar (SEXP);
55 switch (((s)->sxpinfo.type))
60 return (((VECSEXP) (s))->vecsxp.length);
64 while (s != ((void *) 0) && s != R_NilValue)
67 s = ((s)->u.listsxp.cdrval);
71 return Rf_envlength (s);
78 Rf_lang3 (SEXP s, SEXP t, SEXP u)
83 typedef SEXP (*CCODE) (SEXP, SEXP, SEXP, SEXP);
85 static SEXP PlusSymbol;
86 static SEXP MinusSymbol;
87 static SEXP DivideSymbol;
91 SEXP AddParens (SEXP expr);
97 if (((s)->sxpinfo.type) == 6 && ((s)->u.listsxp.carval) == MinusSymbol)
99 switch (Rf_length (s))
104 if (((((((s)->u.listsxp.cdrval))->u.listsxp.cdrval))->u.listsxp.
105 carval) == R_MissingArg)
116 simplify (SEXP fun, SEXP arg1, SEXP arg2)
119 if (fun == PlusSymbol)
123 else if (isUminus (arg1))
125 simplify (MinusSymbol, arg2,
126 ((((arg1)->u.listsxp.cdrval))->u.listsxp.carval));
127 else if (isUminus (arg2))
129 simplify (MinusSymbol, arg1,
130 ((((arg2)->u.listsxp.cdrval))->u.listsxp.carval));
132 else if (fun == DivideSymbol)
134 ans = Rf_lang3 (DivideSymbol, arg1, arg2);
142 D (SEXP expr, SEXP var)
144 return simplify (PlusSymbol,
146 (((((expr)->u.listsxp.cdrval))->u.listsxp.carval),
149 (((((((expr)->u.listsxp.cdrval))->u.listsxp.cdrval))->
150 u.listsxp.carval), var)));
154 do_D (SEXP call, SEXP op, SEXP args, SEXP env)
158 expr = ((args)->u.listsxp.carval);
159 Rf_protect (expr = D (expr, var));
160 expr = AddParens (expr);