https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93805
--- Comment #3 from Patrick Palka <ppalka at gcc dot gnu.org> --- Reduced test case: $ cat 93805.C struct B { B() {} }; struct C { B b = B(); }; C c; $ g++ -Wnoexcept 93805.C 93805.C:11:3: warning: noexcept-expression evaluates to ‘false’ because of a call to ‘B::B()’ [-Wnoexcept] 11 | C c; | ^ 93805.C:3:3: note: but ‘B::B()’ does not throw; perhaps it should be declared ‘noexcept’ 3 | B() {} | ^ The commit in question adds a complain parameter to get_defaulted_eh_spec and passes it down to synthesized_method_walk, and we eventually call expr_noexcept_p in walk_field_subops with complain=tf_warning_or_error instead of with complain=tf_none originally, which is the immediate cause of the warning. We're calling expr_noexcept_p from there to determine whether the NSDMI of C::b is noexcept (so that we can determine the exception specification of C's synthesized default constructor), and we're warning because the NSDMI of C::b is not noexcept, but it could be if the non-throwing ctor B::B were marked noexcept. ISTM we can either disable the -Wnoexcept warning here, or we can keep the warning but improve the warning message in this case.