diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index baed6e14732f..9a3324fe306a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-27  Marek Polacek  <polacek@redhat.com>
+
+	PR c++/65556
+	* semantics.c (finish_switch_cond): If the unlowered type is not an
+	enum, use the type of the condition.
+
 2015-03-27  Jason Merrill  <jason@redhat.com>
 
 	PR c++/65509
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index f325e41f417f..74af7e842c73 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1165,6 +1165,8 @@ finish_switch_cond (tree cond, tree switch_stmt)
 	}
       /* We want unlowered type here to handle enum bit-fields.  */
       orig_type = unlowered_expr_type (cond);
+      if (TREE_CODE (orig_type) != ENUMERAL_TYPE)
+	orig_type = TREE_TYPE (cond);
       if (cond != error_mark_node)
 	{
 	  /* Warn if the condition has boolean value.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c1adea5ff192..a5863094050b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-27  Marek Polacek  <polacek@redhat.com>
+
+	PR c++/65556
+	* c-c++-common/pr65556.c: New test.
+
 2015-03-27  Jan Hubicka  <hubicka@ucw.cz>
 
 	PR ipa/65600
diff --git a/gcc/testsuite/c-c++-common/pr65556.c b/gcc/testsuite/c-c++-common/pr65556.c
new file mode 100644
index 000000000000..c6729a136298
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr65556.c
@@ -0,0 +1,23 @@
+/* PR c++/65556 */
+/* { dg-do compile } */
+
+struct S
+{
+  long l: 1;
+  long l2: 41;
+  unsigned long ul: 1;
+  unsigned long ul2: 41;
+} s;
+
+void
+fn ()
+{
+  switch (s.l)
+    case 0:;
+  switch (s.ul)
+    case 0:;
+  switch (s.l2)
+    case 0:;
+  switch (s.ul2)
+    case 0:;
+}