Use given throwable as the cause for the IAE that's thrown during loop
detection.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=165643812
diff --git a/android/guava-tests/test/com/google/common/base/ThrowablesTest.java b/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
index 756642e..5ac365e 100644
--- a/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
+++ b/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
@@ -553,6 +553,7 @@
       Throwables.getRootCause(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasCauseThat().isSameAs(cause);
     }
   }
 
@@ -641,6 +642,7 @@
       Throwables.getCausalChain(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasCauseThat().isSameAs(cause);
     }
   }
 
diff --git a/android/guava/src/com/google/common/base/Throwables.java b/android/guava/src/com/google/common/base/Throwables.java
index 4cc913d..81dacba 100644
--- a/android/guava/src/com/google/common/base/Throwables.java
+++ b/android/guava/src/com/google/common/base/Throwables.java
@@ -262,7 +262,7 @@
       throwable = cause;
 
       if (throwable == slowPointer) {
-        throw new IllegalArgumentException("Loop in causal chain detected @ " + throwable);
+        throw new IllegalArgumentException("Loop in causal chain detected.", throwable);
       }
       if (advanceSlowPointer) {
         slowPointer = slowPointer.getCause();
@@ -305,7 +305,7 @@
       causes.add(throwable);
 
       if (throwable == slowPointer) {
-        throw new IllegalArgumentException("Loop in causal chain detected @ " + throwable);
+        throw new IllegalArgumentException("Loop in causal chain detected.", throwable);
       }
       if (advanceSlowPointer) {
         slowPointer = slowPointer.getCause();
diff --git a/guava-tests/test/com/google/common/base/ThrowablesTest.java b/guava-tests/test/com/google/common/base/ThrowablesTest.java
index 756642e..5ac365e 100644
--- a/guava-tests/test/com/google/common/base/ThrowablesTest.java
+++ b/guava-tests/test/com/google/common/base/ThrowablesTest.java
@@ -553,6 +553,7 @@
       Throwables.getRootCause(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasCauseThat().isSameAs(cause);
     }
   }
 
@@ -641,6 +642,7 @@
       Throwables.getCausalChain(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasCauseThat().isSameAs(cause);
     }
   }
 
diff --git a/guava/src/com/google/common/base/Throwables.java b/guava/src/com/google/common/base/Throwables.java
index 4cc913d..81dacba 100644
--- a/guava/src/com/google/common/base/Throwables.java
+++ b/guava/src/com/google/common/base/Throwables.java
@@ -262,7 +262,7 @@
       throwable = cause;
 
       if (throwable == slowPointer) {
-        throw new IllegalArgumentException("Loop in causal chain detected @ " + throwable);
+        throw new IllegalArgumentException("Loop in causal chain detected.", throwable);
       }
       if (advanceSlowPointer) {
         slowPointer = slowPointer.getCause();
@@ -305,7 +305,7 @@
       causes.add(throwable);
 
       if (throwable == slowPointer) {
-        throw new IllegalArgumentException("Loop in causal chain detected @ " + throwable);
+        throw new IllegalArgumentException("Loop in causal chain detected.", throwable);
       }
       if (advanceSlowPointer) {
         slowPointer = slowPointer.getCause();