diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 65f556e0c7675ff87f6edab7c7d6285157516063..3453df8aa184a641670aba47280dd21bc755fa39 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 2018-04-30  Jason Merrill  <jason@redhat.com>
 
+	PR c++/85580 - extern "C" and local variables
+	* name-lookup.c (check_extern_c_conflict): Ignore local decls.
+
 	PR c++/84701 - unsigned typeof.
 	* decl.c (grokdeclarator): Overhaul diagnostics for invalid use
 	of long/short/signed/unsigned.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 2af2462825ca3b9117aa71f1ea37aeb82c4cf400..64c7b6f006e7d8796663cf6d47de11b58972155b 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2527,6 +2527,10 @@ check_extern_c_conflict (tree decl)
   if (DECL_ARTIFICIAL (decl) || DECL_IN_SYSTEM_HEADER (decl))
     return;
 
+  /* This only applies to decls at namespace scope.  */
+  if (!DECL_NAMESPACE_SCOPE_P (decl))
+    return;
+
   if (!extern_c_decls)
     extern_c_decls = hash_table<named_decl_hash>::create_ggc (127);
 
diff --git a/gcc/testsuite/g++.dg/parse/extern-C-2.C b/gcc/testsuite/g++.dg/parse/extern-C-2.C
new file mode 100644
index 0000000000000000000000000000000000000000..d8a4e14b4b71519bbddfc825778c7ce0f70aeff7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/extern-C-2.C
@@ -0,0 +1,22 @@
+// PR c++/85580
+
+extern "C"
+{
+
+  void f1()
+  {
+    union some_type{
+      char a[2];
+      int b;
+    } variable;
+  }
+
+  void f2()
+  {
+    union some_type{
+      char a[2];
+      int b;
+    } variable;
+  }
+
+}