* tree.c (build_min_non_dep): Use unlowered_expr_type.
From-SVN: r245343
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.
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++)
--- /dev/null
+// 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 ();
+}