PR c++/78908 - template ops and bitfields
authorJason Merrill <jason@redhat.com>
Fri, 10 Feb 2017 20:43:33 +0000 (15:43 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 10 Feb 2017 20:43:33 +0000 (15:43 -0500)
* tree.c (build_min_non_dep): Use unlowered_expr_type.

From-SVN: r245343

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/g++.dg/template/bitfield3.C [new file with mode: 0644]

index be51428cc5bbb66b63e6f684b2ce1b604c04287a..4523d128ccc43b306b8b58b4790a4cf72e4d63ad 100644 (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.
index 785dfafae540f051c8159c3a450f312c14786650..56c4bbaf8b87479a8e2a1ca95408307f0c2d4037 100644 (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++)
diff --git a/gcc/testsuite/g++.dg/template/bitfield3.C b/gcc/testsuite/g++.dg/template/bitfield3.C
new file mode 100644 (file)
index 0000000..8f11255
--- /dev/null
@@ -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 ();
+}