Hi! This relies on the previous langhook patch (which greatly simplifies it).
I'm only handling variables for now, DW_AT_const_expr is just weird on functions/methods, it is supposed to appear only on DW_TAG_inlined_subroutine? Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-10-14 Jakub Jelinek <ja...@redhat.com> * dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute if needed. cp/ * cp-objcp-common.c (cp_decl_dwarf_attribute): Handle DW_AT_const_expr. testsuite/ * g++.dg/debug/dwarf2/constexpr-var-1.C: New test. --- gcc/dwarf2out.c.jj 2016-10-14 14:37:15.000000000 +0200 +++ gcc/dwarf2out.c 2016-10-14 15:22:57.878078634 +0200 @@ -21513,6 +21513,14 @@ gen_variable_die (tree decl, tree origin } else tree_add_const_value_attribute_for_decl (var_die, decl_or_origin); + + if ((dwarf_version >= 4 || !dwarf_strict) + && lang_hooks.decls.decl_dwarf_attribute (decl_or_origin, + DW_AT_const_expr) == 1 + && !get_AT (var_die, DW_AT_const_expr) + && (origin_die == NULL || get_AT (origin_die, DW_AT_const_expr) == NULL) + && !specialization_p) + add_AT_flag (var_die, DW_AT_const_expr, 1); } /* Generate a DIE to represent a named constant. */ --- gcc/cp/cp-objcp-common.c.jj 2016-10-14 14:27:56.000000000 +0200 +++ gcc/cp/cp-objcp-common.c 2016-10-14 15:01:27.770495885 +0200 @@ -168,6 +168,11 @@ cp_decl_dwarf_attribute (const_tree decl } break; + case DW_AT_const_expr: + if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl)) + return 1; + break; + default: break; } --- gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C.jj 2016-10-14 15:32:23.323882991 +0200 +++ gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C 2016-10-14 15:31:56.000000000 +0200 @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler-times " DW_AT_const_expr" 2 } } + +constexpr int a = 5; +struct S +{ + static constexpr int b = 6; +} s; Jakub