PR c++/78908 - template ops and bitfields

* tree.c (build_min_non_dep): Use unlowered_expr_type.

From-SVN: r245343
This commit is contained in:
Jason Merrill 2017-02-10 15:43:33 -05:00 committed by Jason Merrill
parent 5c97093ba7
commit 6a2cc46b79
3 changed files with 24 additions and 1 deletions

View File

@ -1,5 +1,8 @@
2017-02-10 Jason Merrill <jason@redhat.com>
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.

View File

@ -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++)

View File

@ -0,0 +1,20 @@
// PR c++/78908
struct A { int a : 1; };
struct F { int foo (A const &); };
template <typename> struct O : F { int foo (A const &); };
struct S {} b;
template <typename L, typename T> int operator<< (L, T) { return (T) 123; }
template <typename T> int O<T>::foo (A const &x) { return b << x.a; }
int
main ()
{
A a = { 0 };
O<int> o;
if (o.foo (a) != 123)
__builtin_abort ();
signed char d = 2;
if ((b << d) != 123)
__builtin_abort ();
}