diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs
index 021e7c77..539738e8 100644
--- a/src/AST/Namespace.cs
+++ b/src/AST/Namespace.cs
@@ -387,12 +387,11 @@ namespace CppSharp.AST
 
         public Enumeration FindEnumWithItem(string name)
         {
-            var result = Enums.Find(e => e.ItemsByName.ContainsKey(name));
-            if (result == null)
-                result = Namespaces.Select(ns => ns.FindEnumWithItem(name)).FirstOrDefault();
-            if (result == null)
-                result = Classes.Select(c => c.FindEnumWithItem(name)).FirstOrDefault();
-            return result;
+            return Enums.Find(e => e.ItemsByName.ContainsKey(name)) ??
+                (from declContext in Namespaces.Union<DeclarationContext>(Classes)
+                 let @enum = declContext.FindEnumWithItem(name)
+                 where @enum != null
+                 select @enum).FirstOrDefault();
         }
 
         public virtual IEnumerable<Function> FindOperator(CXXOperatorKind kind)
diff --git a/src/Generator.Tests/Passes/TestPasses.cs b/src/Generator.Tests/Passes/TestPasses.cs
index a193f5c5..b7cd700d 100644
--- a/src/Generator.Tests/Passes/TestPasses.cs
+++ b/src/Generator.Tests/Passes/TestPasses.cs
@@ -231,5 +231,31 @@ namespace CppSharp.Generator.Tests.Passes
             var @class = AstContext.FindDecl<Class>("ClassWithAbstractOperator").First();
             Assert.AreEqual(@class.Operators.First().GenerationKind, GenerationKind.None);
         }
+
+        [Test]
+        public void TestRemovalOfUnusedStdTypes()
+        {
+            passBuilder.AddPass(new IgnoreSystemDeclarationsPass());
+            passBuilder.RunPasses(pass => pass.VisitASTContext(AstContext));
+            if (Platform.IsWindows)
+            {
+                Assert.That(AstContext.GetEnumWithMatchingItem("_ALLOC_MASK").Ignore, Is.True);
+                Assert.That(AstContext.FindClass("_Ctypevec").First().Ignore, Is.True);
+                return;
+            }
+            if (Platform.IsLinux)
+            {
+                Assert.That(AstContext.GetEnumWithMatchingItem("PTHREAD_RWLOCK_PREFER_READER_NP").Ignore, Is.True);
+                Assert.That(AstContext.FindClass("pthread_mutex_t").First().Ignore, Is.True);
+                return;
+
+            }
+            if (Platform.IsMacOS)
+            {
+                Assert.That(AstContext.GetEnumWithMatchingItem("__n_words").Ignore, Is.True);
+                Assert.That(AstContext.FindClass("__darwin_fp_control").First().Ignore, Is.True);
+                return;
+            }
+        }
     }
 }
diff --git a/src/Generator/Library.cs b/src/Generator/Library.cs
index e6f63c9b..92ec7615 100644
--- a/src/Generator/Library.cs
+++ b/src/Generator/Library.cs
@@ -77,28 +77,22 @@ namespace CppSharp
 
         public static Enumeration GetEnumWithMatchingItem(this ASTContext context, string pattern)
         {
-            foreach (var module in context.TranslationUnits)
-            {
-                Enumeration @enum = module.FindEnumWithItem(pattern);
-                if (@enum == null) continue;
-                return @enum;
-            }
-
-            return null;
+            return (from unit in context.TranslationUnits
+                    let @enum = unit.FindEnumWithItem(pattern)
+                    where @enum != null
+                    select @enum).FirstOrDefault();
         }
 
         public static Enumeration.Item GenerateEnumItemFromMacro(this Enumeration @enum,
             MacroDefinition macro)
         {
-            var item = new Enumeration.Item
-            {
-                Name = macro.Name,
-                Expression = macro.Expression,
-                Value = ParseMacroExpression(macro.Expression),
-                Namespace = @enum
-            };
-
-            return item;
+            return new Enumeration.Item
+                {
+                    Name = macro.Name,
+                    Expression = macro.Expression,
+                    Value = ParseMacroExpression(macro.Expression),
+                    Namespace = @enum
+                };
         }
 
         static bool ParseToNumber(string num, out long val)
diff --git a/tests/Native/Passes.h b/tests/Native/Passes.h
index d1fdac2d..44b45d3b 100644
--- a/tests/Native/Passes.h
+++ b/tests/Native/Passes.h
@@ -1,3 +1,5 @@
+#include <string>
+
 enum FlagEnum
 {
   A = 1 << 0,