diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 714349094bd..7c41302c75b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2540,7 +2540,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (in_return) { @@ -2568,7 +2568,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (!issued_x87_ret_error) { diff --git a/gcc/testsuite/g++.target/i386/pr99679-1.C b/gcc/testsuite/g++.target/i386/pr99679-1.C new file mode 100644 index 00000000000..36640a4e0a1 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr99679-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Ofast -fipa-pta -mno-80387" } + +#include + +extern "C" void abort (void); + +void +foo (int x, ...) +{ + long double ld; + va_list ap; + va_start (ap, x); + ld = va_arg (ap, long double); + if (ld) + abort (); +} // { dg-error "x87 register return with x87 disabled" "" { target { ! ia32 } } } diff --git a/gcc/testsuite/g++.target/i386/pr99679-2.C b/gcc/testsuite/g++.target/i386/pr99679-2.C new file mode 100644 index 00000000000..cbd3c4958db --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr99679-2.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Ofast -fipa-pta -mgeneral-regs-only" } + +#include + +extern "C" void abort (void); + +void +foo (int x, ...) +{ + double ld; + va_list ap; + va_start (ap, x); + ld = va_arg (ap, double); // { dg-error "SSE register argument with SSE disabled" "" { target { ! ia32 } } } + if (ld) + abort (); +} // { dg-error "SSE register return with SSE disabled" "" { target { ! ia32 } } }