https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85363
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- In C++11 mode the compiler emits a constructor for P: ;; Function constexpr P::P() (null) ;; enabled by -tree-original { <<cleanup_point <<< Unknown tree: expr_stmt (void) (((struct P *) this)->x = TARGET_EXPR <D.5293, <<< Unknown tree: aggr_init_expr 5 __ct_comp D.5293 (struct X *) <<< Unknown tree: void_cst >>> 20 >>>>) >>>>>; } And the initialization of p{} in main is different: ;; Function int main() (null) ;; enabled by -tree-original { <<< Unknown tree: try_block { struct P p; struct P p; <<cleanup_point <<< Unknown tree: expr_stmt (void) (p = <<< Unknown tree: aggr_init_expr 4 __ct_comp D.5358 (struct P *) <<< Unknown tree: void_cst >>> >>>) >>>>>; } <<< Unknown tree: handler try { <<cleanup_point <<< Unknown tree: expr_stmt (void) __cxa_begin_catch (__builtin_eh_pointer (0)) >>>>>; return <retval> = 0; } finally { __cxa_end_catch (); } >>> >>>; return <retval> = 1; } return <retval> = 0; Whereas in C++14 mode p.x gets constructed directly: ;; Function int main() (null) ;; enabled by -tree-original { <<< Unknown tree: try_block { struct P p; struct P p; <<cleanup_point <<< Unknown tree: expr_stmt p.x = TARGET_EXPR <D.5485, <<< Unknown tree: aggr_init_expr 5 __ct_comp D.5485 (struct X *) <<< Unknown tree: void_cst >>> 20 >>>> >>>>>; } <<< Unknown tree: handler try { <<cleanup_point <<< Unknown tree: expr_stmt (void) __cxa_begin_catch (__builtin_eh_pointer (0)) >>>>>; return <retval> = 0; } finally { __cxa_end_catch (); } >>> >>>; return <retval> = 1; } return <retval> = 0;