re PR preprocessor/36649 (-H option doesn't work as expected)
authorJakub Jelinek <jakub@redhat.com>
Thu, 31 Jul 2008 19:12:14 +0000 (21:12 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 31 Jul 2008 19:12:14 +0000 (21:12 +0200)
PR preprocessor/36649
* files.c (struct report_missing_guard_data): New type.
(report_missing_guard): Put paths into an array instead of printing
them right away.  Return 1 rather than 0.
(report_missing_guard_cmp): New function.
(_cpp_report_missing_guards): Sort and print paths gathered by
report_missing_guard callback.

* gcc.dg/pch/cpp-3.hs: Add include guards.
* gcc.dg/pch/cpp-3a.h: Likewise.
* gcc.dg/pch/cpp-3b.h: Likewise.
* gcc.dg/cpp/mi8.c: New test.
* gcc.dg/cpp/mi8a.h: New file.
* gcc.dg/cpp/mi8b.h: New file.
* gcc.dg/cpp/mi8c.h: New file.
* gcc.dg/cpp/mi8d.h: New file.

From-SVN: r138432

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/mi8.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/mi8a.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/mi8b.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/mi8c.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/mi8d.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/pch/cpp-3.hs
gcc/testsuite/gcc.dg/pch/cpp-3a.h
gcc/testsuite/gcc.dg/pch/cpp-3b.h
libcpp/ChangeLog
libcpp/files.c

index 0d2ebbf..f68def0 100644 (file)
@@ -1,5 +1,15 @@
 2008-07-31  Jakub Jelinek  <jakub@redhat.com>
 
+       PR preprocessor/36649
+       * gcc.dg/pch/cpp-3.hs: Add include guards.
+       * gcc.dg/pch/cpp-3a.h: Likewise.
+       * gcc.dg/pch/cpp-3b.h: Likewise.
+       * gcc.dg/cpp/mi8.c: New test.
+       * gcc.dg/cpp/mi8a.h: New file.
+       * gcc.dg/cpp/mi8b.h: New file.
+       * gcc.dg/cpp/mi8c.h: New file.
+       * gcc.dg/cpp/mi8d.h: New file.
+
        PR rtl-optimization/36419
        * g++.dg/eh/async-unwind2.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/cpp/mi8.c b/gcc/testsuite/gcc.dg/cpp/mi8.c
new file mode 100644 (file)
index 0000000..1999918
--- /dev/null
@@ -0,0 +1,8 @@
+/* Test multiple include guards suggestions.  */
+
+/* { dg-do preprocess }
+   { dg-options "-H" }
+   { dg-message "mi8a\.h\n\[^\n\]*mi8c\.h\n\[^\n\]*mi8b\.h\n\[^\n\]*mi8d\.h\nMultiple include guards may be useful for:\n\[^\n\]*mi8a\.h\n\[^\n\]*mi8d\.h\n" "" { target *-*-* } 0 } */
+
+#include "mi8a.h"
+#include "mi8b.h"
diff --git a/gcc/testsuite/gcc.dg/cpp/mi8a.h b/gcc/testsuite/gcc.dg/cpp/mi8a.h
new file mode 100644 (file)
index 0000000..893d9ff
--- /dev/null
@@ -0,0 +1 @@
+#include "mi8c.h"
diff --git a/gcc/testsuite/gcc.dg/cpp/mi8b.h b/gcc/testsuite/gcc.dg/cpp/mi8b.h
new file mode 100644 (file)
index 0000000..8e3482c
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef GUARDB
+#define GUARDB
+#include "mi8d.h"
+#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/mi8c.h b/gcc/testsuite/gcc.dg/cpp/mi8c.h
new file mode 100644 (file)
index 0000000..08c5cab
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef GUARDC
+#define GUARDC
+/* Empty */
+#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/mi8d.h b/gcc/testsuite/gcc.dg/cpp/mi8d.h
new file mode 100644 (file)
index 0000000..710cecc
--- /dev/null
@@ -0,0 +1 @@
+/* Empty */
index 40a8c17..728b1af 100644 (file)
@@ -1 +1,4 @@
+#ifndef CPP_3_H
+#define CPP_3_H
 /* empty */
+#endif
index 2cc9fd2..3788d11 100644 (file)
@@ -1 +1,4 @@
+#ifndef CPP_3A_H
+#define CPP_3A_H
 #include "cpp-3b.h"
+#endif
index 40a8c17..5cb0e81 100644 (file)
@@ -1 +1,4 @@
+#ifndef CPP_3B_H
+#define CPP_3B_H
 /* empty */
+#endif
index cb1de79..49efadc 100644 (file)
@@ -1,3 +1,13 @@
+2008-07-31  Jakub Jelinek  <jakub@redhat.com>
+
+       PR preprocessor/36649
+       * files.c (struct report_missing_guard_data): New type.
+       (report_missing_guard): Put paths into an array instead of printing
+       them right away.  Return 1 rather than 0.
+       (report_missing_guard_cmp): New function.
+       (_cpp_report_missing_guards): Sort and print paths gathered by
+       report_missing_guard callback.
+
 2008-07-22  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        PR 28079
index 1adc58d..007fce7 100644 (file)
@@ -1221,12 +1221,19 @@ cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
   _cpp_do_file_change (pfile, reason, new_name, 1, 0);
 }
 
+struct report_missing_guard_data
+{
+  const char **paths;
+  size_t count;
+};
+
 /* Callback function for htab_traverse.  */
 static int
-report_missing_guard (void **slot, void *b)
+report_missing_guard (void **slot, void *d)
 {
   struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
-  int *bannerp = (int *) b;
+  struct report_missing_guard_data *data
+    = (struct report_missing_guard_data *) d;
 
   /* Skip directories.  */
   if (entry->start_dir != NULL)
@@ -1236,19 +1243,25 @@ report_missing_guard (void **slot, void *b)
       /* We don't want MI guard advice for the main file.  */
       if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
        {
-         if (*bannerp == 0)
+         if (data->paths == NULL)
            {
-             fputs (_("Multiple include guards may be useful for:\n"),
-                    stderr);
-             *bannerp = 1;
+             data->paths = XCNEWVEC (const char *, data->count);
+             data->count = 0;
            }
 
-         fputs (entry->u.file->path, stderr);
-         putc ('\n', stderr);
+         data->paths[data->count++] = file->path;
        }
     }
 
-  return 0;
+  /* Keep traversing the hash table.  */
+  return 1;
+}
+
+/* Comparison function for qsort.  */
+static int
+report_missing_guard_cmp (const void *p1, const void *p2)
+{
+  return strcmp (*(const char *const *) p1, *(const char *const *) p2);
 }
 
 /* Report on all files that might benefit from a multiple include guard.
@@ -1256,9 +1269,29 @@ report_missing_guard (void **slot, void *b)
 void
 _cpp_report_missing_guards (cpp_reader *pfile)
 {
-  int banner = 0;
+  struct report_missing_guard_data data;
+
+  data.paths = NULL;
+  data.count = htab_elements (pfile->file_hash);
+  htab_traverse (pfile->file_hash, report_missing_guard, &data);
 
-  htab_traverse (pfile->file_hash, report_missing_guard, &banner);
+  if (data.paths != NULL)
+    {
+      size_t i;
+
+      /* Sort the paths to avoid outputting them in hash table
+        order.  */
+      qsort (data.paths, data.count, sizeof (const char *),
+            report_missing_guard_cmp);
+      fputs (_("Multiple include guards may be useful for:\n"),
+            stderr);
+      for (i = 0; i < data.count; i++)
+       {
+         fputs (data.paths[i], stderr);
+         putc ('\n', stderr);
+       }
+      free (data.paths);
+    }
 }
 
 /* Locate HEADER, and determine whether it is newer than the current