From d0022b5a13276f1e2fbcfc51a615b41147bf81c2 Mon Sep 17 00:00:00 2001
From: Bruno Oliveira <nicoddemus@gmail.com>
Date: Tue, 5 May 2020 19:20:34 -0300
Subject: [PATCH] 'saferepr' handles classes with broken __getattribute__

Fix #7145
---
 changelog/7145.bugfix.rst   |  1 +
 src/_pytest/_io/saferepr.py |  2 +-
 testing/io/test_saferepr.py | 17 +++++++++++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 changelog/7145.bugfix.rst

diff --git a/changelog/7145.bugfix.rst b/changelog/7145.bugfix.rst
new file mode 100644
index 000000000..def237dc0
--- /dev/null
+++ b/changelog/7145.bugfix.rst
@@ -0,0 +1 @@
+Classes with broken ``__getattribute__`` methods are displayed correctly during failures.
diff --git a/src/_pytest/_io/saferepr.py b/src/_pytest/_io/saferepr.py
index 23af4d0bb..47a00de60 100644
--- a/src/_pytest/_io/saferepr.py
+++ b/src/_pytest/_io/saferepr.py
@@ -20,7 +20,7 @@ def _format_repr_exception(exc: BaseException, obj: Any) -> str:
     except BaseException as exc:
         exc_info = "unpresentable exception ({})".format(_try_repr_or_str(exc))
     return "<[{} raised in repr()] {} object at 0x{:x}>".format(
-        exc_info, obj.__class__.__name__, id(obj)
+        exc_info, type(obj).__name__, id(obj)
     )
 
 
diff --git a/testing/io/test_saferepr.py b/testing/io/test_saferepr.py
index 06084202e..f4ced8fac 100644
--- a/testing/io/test_saferepr.py
+++ b/testing/io/test_saferepr.py
@@ -154,3 +154,20 @@ def test_pformat_dispatch():
     assert _pformat_dispatch("a") == "'a'"
     assert _pformat_dispatch("a" * 10, width=5) == "'aaaaaaaaaa'"
     assert _pformat_dispatch("foo bar", width=5) == "('foo '\n 'bar')"
+
+
+def test_broken_getattribute():
+    """saferepr() can create proper representations of classes with
+    broken __getattribute__ (#7145)
+    """
+
+    class SomeClass:
+        def __getattribute__(self, attr):
+            raise RuntimeError
+
+        def __repr__(self):
+            raise RuntimeError
+
+    assert saferepr(SomeClass()).startswith(
+        "<[RuntimeError() raised in repr()] SomeClass object at 0x"
+    )