Index: /trunk/src/kmk/kmk_cc_exec.c
===================================================================
--- /trunk/src/kmk/kmk_cc_exec.c	(revision 2776)
+++ /trunk/src/kmk/kmk_cc_exec.c	(revision 2777)
@@ -325,4 +325,6 @@
     uint32_t                uInputHash;
 #endif
+    /** Reference count. */
+    uint32_t volatile       cRefs;
 } KMKCCEXPPROG;
 /** Pointer to a string expansion program. */
@@ -1457,4 +1459,5 @@
         pProg->pFirstInstr  = (PKMKCCEXPCORE)kmk_cc_block_get_next_ptr(pBlock);
         kmk_cc_exp_stats_init(&pProg->Stats);
+        pProg->cRefs        = 1;
 #ifdef KMK_CC_STRICT
         pProg->uInputHash   = kmk_cc_debug_string_hash_n(0, pchStr, cchStr);
@@ -1916,5 +1919,11 @@
         pchDst = ensure_variable_buffer_space(pchDst, offStart + pProg->Stats.cchAvg + 32);
 
+    KMK_CC_ASSERT(pProg->cRefs > 0);
+    pProg->cRefs++;
+
     pchDst = kmk_exec_expand_instruction_stream_to_var_buf(pProg->pFirstInstr, pchDst);
+
+    pProg->cRefs--;
+    KMK_CC_ASSERT(pProg->cRefs > 0);
 
     cchResult = (uint32_t)(pchDst - variable_buffer);
@@ -1962,5 +1971,8 @@
 void  kmk_cc_variable_changed(struct variable *pVar)
 {
-    KMK_CC_ASSERT(pVar->evalprog || pVar->expandprog);
+    PKMKCCEXPPROG pProg = pVar->expandprog;
+
+    KMK_CC_ASSERT(pVar->evalprog || pProg);
+
 #if 0
     if (pVar->evalprog)
@@ -1970,7 +1982,11 @@
     }
 #endif
-    if (pVar->expandprog)
-    {
-        kmk_cc_block_free_list(pVar->expandprog->pBlockTail);
+
+    if (pProg)
+    {
+        if (pProg->cRefs == 1)
+            kmk_cc_block_free_list(pProg->pBlockTail);
+        else
+            fatal(NULL, _("Modifying a variable (%s) while its expansion program is running is not supported"), pVar->name);
         pVar->expandprog = NULL;
     }
@@ -1985,5 +2001,8 @@
 void  kmk_cc_variable_deleted(struct variable *pVar)
 {
-    KMK_CC_ASSERT(pVar->evalprog || pVar->expandprog);
+    PKMKCCEXPPROG pProg = pVar->expandprog;
+
+    KMK_CC_ASSERT(pVar->evalprog || pProg);
+
 #if 0
     if (pVar->evalprog)
@@ -1993,7 +2012,11 @@
     }
 #endif
-    if (pVar->expandprog)
-    {
-        kmk_cc_block_free_list(pVar->expandprog->pBlockTail);
+
+    if (pProg)
+    {
+        if (pProg->cRefs == 1)
+            kmk_cc_block_free_list(pProg->pBlockTail);
+        else
+            fatal(NULL, _("Deleting a variable (%s) while its expansion program is running is not supported"), pVar->name);
         pVar->expandprog = NULL;
     }
