continue;
param_access *pacc = find_param_access (param_desc, argacc->unit_offset,
argacc->unit_size);
- if (!pacc || !pacc->certain)
+ if (!pacc
+ || !pacc->certain
+ || !types_compatible_p (argacc->type, pacc->type))
return false;
}
return true;
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -std=c99" } */
+
+
+int puts(const char *);
+int snprintf(char *, unsigned long, const char *, ...);
+unsigned long strspn(const char *, const char *);
+
+struct TValue {
+ union {
+ long long i;
+ double n;
+ } value_;
+ unsigned char tt_;
+};
+
+static int tostringbuff (struct TValue *num, char *str) {
+ int len;
+ if (num->tt_ == 3) {
+ len = snprintf(str,50,"%lld",num->value_.i);
+ } else {
+ len = snprintf(str,50,"%.14g",num->value_.n);
+ if (str[strspn(str, "-0123456789")] == '\0') {
+ str[len++] = '.';
+ str[len++] = '0';
+ }
+ }
+ return len;
+}
+
+void unused (int *buff, struct TValue *num) {
+ char junk[50];
+ *buff += tostringbuff(num, junk);
+}
+
+char space[400];
+
+void addnum2buff (int *buff, struct TValue *num) __attribute__((__noinline__));
+void addnum2buff (int *buff, struct TValue *num) {
+ *buff += tostringbuff(num, space);
+}
+
+int __attribute__((noipa)) check_space (char *s)
+{
+ return (s[0] == '1' && s[1] == '.' && s[2] =='0' && s[3] == '\0');
+}
+
+int main(void) {
+ int buff = 0;
+ struct TValue num;
+ num.value_.n = 1.0;
+ num.tt_ = 19;
+ addnum2buff(&buff, &num);
+ if (!check_space(space))
+ __builtin_abort ();
+ return 0;
+}