Index: modules/simpletest/tests/module.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/module.test,v
retrieving revision 1.1
diff -u -p -r1.1 module.test
--- modules/simpletest/tests/module.test	3 Jan 2009 08:45:28 -0000	1.1
+++ modules/simpletest/tests/module.test	5 Jan 2009 19:36:05 -0000
@@ -60,6 +60,19 @@ class ModuleUnitTest extends DrupalWebTe
   }
 
   /**
+   * Tests the hook_modules_uninstalled of the user module.
+   */
+  function testUserPermsUninstalled() {
+    // Uninstalles the module_test module, so hook_modules_uninstalled() is executed.
+    drupal_uninstall_modules(array('module_test'));
+
+    // Are the perms from module_test removed from {role_permission}.
+    $count = db_query("SELECT COUNT(rid) FROM {role_permission} WHERE permission = :perm",
+      array(':perm' => 'module_test perm'))->fetchField();
+    $this->assertEqual(0, $count, t('Permissions were all removed.'));
+  }
+
+  /**
    * Assert that module_list() return the expected values.
    *
    * @param $expected_values
@@ -70,4 +83,5 @@ class ModuleUnitTest extends DrupalWebTe
     ksort($expected_values);
     $this->assertIdentical($expected_values, module_list(FALSE, TRUE), t('@condition: module_list() returns correctly sorted results', array('@condition' => $condition)));
   }
+
 }
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.952
diff -u -p -r1.952 user.module
--- modules/user/user.module	4 Jan 2009 16:10:48 -0000	1.952
+++ modules/user/user.module	5 Jan 2009 19:36:09 -0000
@@ -2441,3 +2441,17 @@ function _user_forms(&$edit, $account, $
   return empty($groups) ? FALSE : $groups;
 }
 
+/**
+ * Implementation of hook_modules_uninstalled().
+ */
+function user_modules_uninstalled($modules) {
+  $permissions = array();
+  foreach ($modules as $module) {
+    $permissions = array_merge($permissions, array_keys(module_invoke($module, 'perm')));
+  }
+  if (!empty($permissions)) {
+    db_delete('role_permission')
+      ->condition('permission', array_keys($permissions), 'IN')
+      ->execute();
+  }
+}
