macro.c (enter_macro_context): Call cb.used callback if defined.

	* macro.c (enter_macro_context): Call cb.used callback if defined.
	* directives.c (do_idef, do_ifndef): Ditto.
	* include/cpplib.h (struct cpp_callbacks): Add used callback.

From-SVN: r154359
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index c842e80..af05ca3 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-20  Arnaud Charlet  <charlet@adacore.com>
+
+	* macro.c (enter_macro_context): Call cb.used callback if defined.
+	* directives.c (do_idef, do_ifndef): Ditto.
+	* include/cpplib.h (struct cpp_callbacks): Add used callback.
+
 2009-11-11  Kai Tietz  <kai.tietz@onevision.com>
 
 	* directives.c (do_pragma_push_macro): New pragma handler.
diff --git a/libcpp/directives.c b/libcpp/directives.c
index aed940e..409d908 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -1808,6 +1808,8 @@
 		    pfile->cb.used_undef (pfile, pfile->directive_line, node);
 		}
 	    }
+	  if (pfile->cb.used)
+	    pfile->cb.used (pfile, pfile->directive_line, node);
 	  check_eol (pfile, false);
 	}
     }
@@ -1844,6 +1846,8 @@
 		    pfile->cb.used_undef (pfile, pfile->directive_line, node);
 		}
 	    }
+	  if (pfile->cb.used)
+	    pfile->cb.used (pfile, pfile->directive_line, node);
 	  check_eol (pfile, false);
 	}
     }
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index e95f01a..6175bbc 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -508,6 +508,9 @@
   /* Called before #define and #undef or other macro definition
      changes are processed.  */
   void (*before_define) (cpp_reader *);
+  /* Called whenever a macro is expanded or tested.
+     Second argument is the location of the start of the current expansion.  */
+  void (*used) (cpp_reader *, source_location, cpp_hashnode *);
 };
 
 #ifdef VMS
diff --git a/libcpp/macro.c b/libcpp/macro.c
index 1d284cf..6647db5 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -885,6 +885,9 @@
 	    pfile->cb.used_define (pfile, pfile->directive_line, node);
 	}
 
+      if (pfile->cb.used)
+	pfile->cb.used (pfile, result->src_loc, node);
+
       macro->used = 1;
 
       if (macro->paramc == 0)