--- /dev/null
+typedef char *array[10];
+
+static array digits_names = {"zero", "one", "two", "three", "four",
+                            "five", "six", "seven", "eight", "nine"};
+
+void *foo (void)
+{
+  return digits_names;
+}
 
--- /dev/null
+typedef char *array[9];
+
+static array digits_names = {"one", "two", "three", "four",
+                            "five", "six", "seven", "eight", "nine"};
+
+void *bar (void)
+{
+  return digits_names;
+}
 
--- /dev/null
+#as:
+#source: array-char-conflicting-1.c
+#source: array-char-conflicting-2.c
+#objdump: --ctf
+#cc: -fPIC
+#ld: -shared --ctf-variables --hash-style=sysv
+#name: Arrays (conflicted)
+
+.*: +file format .*
+
+Contents of CTF section .ctf:
+
+  Header:
+    Magic number: 0xdff2
+    Version: 4 \(CTF_VERSION_3\)
+#...
+  Variables:
+    digits_names -> .* \(kind 4\) char \*\[10\] .*
+#...
+  Header:
+#...
+    Parent name: .ctf
+#...
+  Variables:
+    digits_names -> .* \(kind 4\) char \*\[9\] .*
+#...
 
--- /dev/null
+#as:
+#source: array-char.c
+#source: array-extern.c
+#objdump: --ctf
+#ld: -shared --ctf-variables --hash-style=sysv
+#name: Arrays (extern)
+
+.*: +file format .*
+
+Contents of CTF section .ctf:
+
+  Header:
+    Magic number: 0xdff2
+    Version: 4 \(CTF_VERSION_3\)
+#...
+    Data object section:       .* \(0x[1-9a-f][0-9a-f]* bytes\)
+    Type section:      .* \(0x44 bytes\)
+    String section:    .*
+
+  Labels:
+
+  Data objects:
+    digits_names -> 0x[0-9a-f]*: \(kind 4\) char \*\[10\] .*
+
+  Function objects:
+
+  Variables:
+
+  Types:
+#...
+    0x[0-9a-f]*: \(kind 4\) .*\[10\] \(size .*
+#...
 
             the most-popular type on insertion, and we want conflicting structs
             et al to have all forwards left intact, so the user is notified
             that this type is conflicting.  TODO: improve this in future by
-            setting such forwards non-root-visible.)  */
+            setting such forwards non-root-visible.)
+
+            If multiple distinct types are "most common", pick the one that
+            appears first on the link line, and within that, the one with the
+            lowest type ID.  (See sort_output_mapping.)  */
 
          const void *key;
          const void *count;
          const char *hval;
          long max_hcount = -1;
+         void *max_gid = NULL;
          const char *max_hval = NULL;
 
          if (ctf_dynhash_elements (name_counts) <= 1)
          while ((err = ctf_dynhash_cnext (name_counts, &j, &key, &count)) == 0)
            {
              hval = (const char *) key;
+
              if ((long int) (uintptr_t) count > max_hcount)
                {
                  max_hcount = (long int) (uintptr_t) count;
                  max_hval = hval;
+                 max_gid = ctf_dynhash_lookup (d->cd_output_first_gid, hval);
+               }
+             else if ((long int) (uintptr_t) count == max_hcount)
+               {
+                 void *gid = ctf_dynhash_lookup (d->cd_output_first_gid, hval);
+
+                 if (CTF_DEDUP_GID_TO_INPUT(gid) < CTF_DEDUP_GID_TO_INPUT(max_gid)
+                     || (CTF_DEDUP_GID_TO_INPUT(gid) == CTF_DEDUP_GID_TO_INPUT(max_gid)
+                         && CTF_DEDUP_GID_TO_TYPE(gid) < CTF_DEDUP_GID_TO_TYPE(max_gid)))
+                   {
+                     max_hval = hval;
+                     max_gid = ctf_dynhash_lookup (d->cd_output_first_gid, hval);
+                   }
                }
            }
          if (err != ECTF_NEXT_END)