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;