From 5c9c546b9d321b34fd02d2cab8d020297dd7686a Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Fri, 13 Oct 2017 15:03:41 -0400
Subject: [PATCH] PR c++/82357 - bit-field in template

	* tree.c (cp_stabilize_reference): Just return a NON_DEPENDENT_EXPR.

From-SVN: r253739
---
 gcc/cp/ChangeLog                          | 5 +++++
 gcc/cp/tree.c                             | 4 ++++
 gcc/testsuite/g++.dg/template/bitfield4.C | 6 ++++++
 gcc/testsuite/g++.dg/template/cast4.C     | 4 ++++
 4 files changed, 19 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/template/bitfield4.C
 create mode 100644 gcc/testsuite/g++.dg/template/cast4.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c22583554e54..2b6e3b68b3c6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-13  Jason Merrill  <jason@redhat.com>
+
+	PR c++/82357 - bit-field in template
+	* tree.c (cp_stabilize_reference): Just return a NON_DEPENDENT_EXPR.
+
 2017-10-13  David Malcolm  <dmalcolm@redhat.com>
 
 	* cp-tree.h (maybe_show_extern_c_location): New decl.
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index e21ff6a1572f..366f46f15065 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -333,6 +333,10 @@ cp_stabilize_reference (tree ref)
 {
   switch (TREE_CODE (ref))
     {
+    case NON_DEPENDENT_EXPR:
+      /* We aren't actually evaluating this.  */
+      return ref;
+
     /* We need to treat specially anything stabilize_reference doesn't
        handle specifically.  */
     case VAR_DECL:
diff --git a/gcc/testsuite/g++.dg/template/bitfield4.C b/gcc/testsuite/g++.dg/template/bitfield4.C
new file mode 100644
index 000000000000..4927b7ab1444
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/bitfield4.C
@@ -0,0 +1,6 @@
+// PR c++/82357
+
+template <typename> struct A {
+  A() { x |= 0; }
+  int x : 8;
+};
diff --git a/gcc/testsuite/g++.dg/template/cast4.C b/gcc/testsuite/g++.dg/template/cast4.C
new file mode 100644
index 000000000000..2f46c7189ebe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/cast4.C
@@ -0,0 +1,4 @@
+template <class T> void f()
+{
+  static_cast<int&>(42);	// { dg-error "static_cast" }
+}