report constants and variables in ParseCallbacks::new_item_found
diff --git a/bindgen-tests/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h b/bindgen-tests/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h
index eb44e5f..fd38555 100644
--- a/bindgen-tests/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h
+++ b/bindgen-tests/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h
@@ -30,3 +30,11 @@
 // Functions
 
 void named_function();
+
+// Constants
+
+const int MOD = 998244353;
+
+// Variable
+
+const char* name;
diff --git a/bindgen-tests/tests/parse_callbacks/item_discovery_callback/mod.rs b/bindgen-tests/tests/parse_callbacks/item_discovery_callback/mod.rs
index a9a9523..5040d10 100644
--- a/bindgen-tests/tests/parse_callbacks/item_discovery_callback/mod.rs
+++ b/bindgen-tests/tests/parse_callbacks/item_discovery_callback/mod.rs
@@ -180,6 +180,28 @@
                 553,
             ),
         ),
+        (
+            DiscoveredItemId::new(30),
+            ItemExpectations::new(
+                DiscoveredItem::Constant {
+                    final_name: "MOD".to_string(),
+                },
+                36,
+                11,
+                596,
+            ),
+        ),
+        (
+            DiscoveredItemId::new(34),
+            ItemExpectations::new(
+                DiscoveredItem::Variable {
+                    final_name: "name".to_string(),
+                },
+                40,
+                13,
+                639,
+            ),
+        ),
     ]);
     test_item_discovery_callback(
         "/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h", &expected);
@@ -280,6 +302,12 @@
         DiscoveredItem::Method { .. } => {
             compare_method_info(&expected_item.item, &generated_item.0)
         }
+        DiscoveredItem::Constant { .. } => {
+            compare_constant_info(&expected_item.item, &generated_item.0)
+        }
+        DiscoveredItem::Variable { .. } => {
+            compare_variable_info(&expected_item.item, &generated_item.0)
+        }
     };
 
     if is_a_match {
@@ -508,3 +536,51 @@
     }
     true
 }
+
+pub fn compare_constant_info(
+    expected_item: &DiscoveredItem,
+    generated_item: &DiscoveredItem,
+) -> bool {
+    let DiscoveredItem::Constant {
+        final_name: expected_final_name,
+    } = expected_item
+    else {
+        unreachable!()
+    };
+
+    let DiscoveredItem::Constant {
+        final_name: generated_final_name,
+    } = generated_item
+    else {
+        unreachable!()
+    };
+
+    if !compare_names(expected_final_name, generated_final_name) {
+        return false;
+    }
+    true
+}
+
+pub fn compare_variable_info(
+    expected_item: &DiscoveredItem,
+    generated_item: &DiscoveredItem,
+) -> bool {
+    let DiscoveredItem::Variable {
+        final_name: expected_final_name,
+    } = expected_item
+    else {
+        unreachable!()
+    };
+
+    let DiscoveredItem::Variable {
+        final_name: generated_final_name,
+    } = generated_item
+    else {
+        unreachable!()
+    };
+
+    if !compare_names(expected_final_name, generated_final_name) {
+        return false;
+    }
+    true
+}
diff --git a/bindgen/callbacks.rs b/bindgen/callbacks.rs
index c8ac9a5..7967912 100644
--- a/bindgen/callbacks.rs
+++ b/bindgen/callbacks.rs
@@ -250,6 +250,18 @@
         /// Type to which this method belongs.
         parent: DiscoveredItemId,
     }, // modules, etc.
+
+    /// A constant.
+    Constant {
+        /// The final name of the generated binding
+        final_name: String,
+    },
+
+    /// A variable.
+    Variable {
+        /// The final name of the generated binding
+        final_name: String,
+    },
 }
 
 /// Relevant information about a type to which new derive attributes will be added using
diff --git a/bindgen/codegen/mod.rs b/bindgen/codegen/mod.rs
index 48b1518..b6615a1 100644
--- a/bindgen/codegen/mod.rs
+++ b/bindgen/codegen/mod.rs
@@ -694,6 +694,12 @@
         let ty = var_ty.to_rust_ty_or_opaque(ctx, &());
 
         if let Some(val) = self.val() {
+            utils::call_discovered_item_callback(ctx, item, || {
+                DiscoveredItem::Constant {
+                    final_name: canonical_name.clone(),
+                }
+            });
+
             let const_expr = match *val {
                 VarType::Bool(val) => Some(val.to_token_stream()),
                 VarType::Int(val) => {
@@ -783,6 +789,12 @@
                 });
             }
         } else {
+            utils::call_discovered_item_callback(ctx, item, || {
+                DiscoveredItem::Variable {
+                    final_name: canonical_name.clone(),
+                }
+            });
+
             let symbol: &str = self.link_name().unwrap_or_else(|| {
                 let link_name =
                     self.mangled_name().unwrap_or_else(|| self.name());