Index: wp-includes/category-template.php
===================================================================
--- wp-includes/category-template.php	(revision 15649)
+++ wp-includes/category-template.php	(working copy)
@@ -47,29 +47,32 @@
  * @param bool $link Optional, default is false. Whether to format with link.
  * @param string $separator Optional, default is '/'. How to separate categories.
  * @param bool $nicename Optional, default is false. Whether to use nice name for display.
- * @param array $visited Optional. Already linked to categories to prevent duplicates.
+ * @param array $deprecated Not used.
  * @return string
  */
-function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
-	$chain = '';
-	$parent = &get_category( $id );
+function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {
+	if ( !empty( $deprecated ) )
+		_deprecated_argument( __FUNCTION__, '3.1' );
+
+	$parent = &get_term( $id, 'category' );
 	if ( is_wp_error( $parent ) )
 		return $parent;
 
-	if ( $nicename )
-		$name = $parent->slug;
-	else
-		$name = $parent->cat_name;
+	$ancestors = get_ancestors( $parent->term_id, 'category' );
+	array_unshift( $ancestors, $parent->term_id );
 
-	if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
-		$visited[] = $parent->parent;
-		$chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited );
+	$chain = '';
+	$field = $nicename ? 'slug' : 'name';
+	foreach ( array_reverse( $ancestors ) as $term_id ) {
+		$term = get_term( $term_id, 'category' );
+		$name = $term->$field;
+
+		if ( $link )
+			$chain .= '<a href="' . get_category_link( $term_id ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $term->name ) ) . '">'.$name.'</a>' . $separator;
+		else
+		$chain .= $name.$separator;
 	}
 
-	if ( $link )
-		$chain .= '<a href="' . get_category_link( $parent->term_id ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->cat_name ) ) . '">'.$name.'</a>' . $separator;
-	else
-		$chain .= $name.$separator;
 	return $chain;
 }
 
@@ -1006,4 +1009,4 @@
 	return $r;
 }
 
-?>
\ No newline at end of file
+?>
