Handle multi anonymous struct with same USR (#559)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e996b1c..45b5993 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 7.2.11
+
+- Fix invalid struct/enum member references due to multiple anonymous struct/enum in a declaration.
+
 # 7.2.10
 
 - Generate parameter names in function pointer fields and typedefs.
diff --git a/lib/src/header_parser/utils.dart b/lib/src/header_parser/utils.dart
index a674618..f03df3f 100644
--- a/lib/src/header_parser/utils.dart
+++ b/lib/src/header_parser/utils.dart
@@ -60,7 +60,11 @@
 
 extension CXCursorExt on clang_types.CXCursor {
   String usr() {
-    return clang.clang_getCursorUSR(this).toStringAndDispose();
+    var res = clang.clang_getCursorUSR(this).toStringAndDispose();
+    if (isAnonymousRecordDecl()) {
+      res += "@offset:${sourceFileOffset()}";
+    }
+    return res;
   }
 
   /// Returns the kind int from [clang_types.CXCursorKind].
@@ -124,6 +128,17 @@
     return s;
   }
 
+  int sourceFileOffset() {
+    final cxsource = clang.clang_getCursorLocation(this);
+    final cxOffset = calloc<UnsignedInt>();
+
+    // Puts the values in these pointers.
+    clang.clang_getFileLocation(cxsource, nullptr, nullptr, nullptr, cxOffset);
+    final offset = cxOffset.value;
+    calloc.free(cxOffset);
+    return offset;
+  }
+
   /// Returns whether the file that the cursor is inside is a system header.
   bool isInSystemHeader() {
     final location = clang.clang_getCursorLocation(this);
diff --git a/pubspec.yaml b/pubspec.yaml
index 6c2e147..bebcaf5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 7.2.10
+version: 7.2.11
 description: Generator for FFI bindings, using LibClang to parse C header files.
 repository: https://github.com/dart-lang/ffigen
 
diff --git a/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart b/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
index 585ab9a..b35cd3d 100644
--- a/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
+++ b/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
@@ -63,3 +63,19 @@
 class Union4 extends ffi.Opaque {}
 
 class Union5 extends ffi.Opaque {}
+
+class Union6 extends ffi.Union {
+  external UnnamedUnion1 unnamed;
+
+  external UnnamedUnion2 unnamed1;
+}
+
+class UnnamedUnion1 extends ffi.Union {
+  @ffi.Float()
+  external double a;
+}
+
+class UnnamedUnion2 extends ffi.Union {
+  @ffi.Float()
+  external double b;
+}
diff --git a/test/header_parser_tests/unions.h b/test/header_parser_tests/unions.h
index 1bd9ae1..e7d86ff 100644
--- a/test/header_parser_tests/unions.h
+++ b/test/header_parser_tests/unions.h
@@ -32,6 +32,20 @@
     union Union3 s; // Incomplete nested union.
 };
 
+// Multiple anonymous declarations
+union Union6
+{
+    union
+    {
+        float a;
+    };
+
+    union
+    {
+        float b;
+    };
+};
+
 void func1(union Union2 *s);
 
 // Incomplete array parameter will be treated as a pointer.