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
);