From 6a2cc46b799d01c8abbc98c70b1bacca9fd7bc2d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 10 Feb 2017 15:43:33 -0500 Subject: [PATCH] PR c++/78908 - template ops and bitfields * tree.c (build_min_non_dep): Use unlowered_expr_type. From-SVN: r245343 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/tree.c | 2 +- gcc/testsuite/g++.dg/template/bitfield3.C | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/bitfield3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index be51428cc5b..4523d128ccc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-02-10 Jason Merrill + PR c++/78908 - template ops and bitfields + * tree.c (build_min_non_dep): Use unlowered_expr_type. + PR c++/78897 - constexpr union * constexpr.c (cxx_eval_store_expression): A store to a union member erases a previous store to another member. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 785dfafae54..56c4bbaf8b8 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2884,7 +2884,7 @@ build_min_non_dep (enum tree_code code, tree non_dep, ...) t = make_node (code); length = TREE_CODE_LENGTH (code); - TREE_TYPE (t) = TREE_TYPE (non_dep); + TREE_TYPE (t) = unlowered_expr_type (non_dep); TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep); for (i = 0; i < length; i++) diff --git a/gcc/testsuite/g++.dg/template/bitfield3.C b/gcc/testsuite/g++.dg/template/bitfield3.C new file mode 100644 index 00000000000..8f1125537e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/bitfield3.C @@ -0,0 +1,20 @@ +// PR c++/78908 + +struct A { int a : 1; }; +struct F { int foo (A const &); }; +template struct O : F { int foo (A const &); }; +struct S {} b; +template int operator<< (L, T) { return (T) 123; } +template int O::foo (A const &x) { return b << x.a; } + +int +main () +{ + A a = { 0 }; + O o; + if (o.foo (a) != 123) + __builtin_abort (); + signed char d = 2; + if ((b << d) != 123) + __builtin_abort (); +} -- 2.30.2