aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/AST/Type.cpp2
-rw-r--r--test/SemaCXX/decltype-crash.cpp5
2 files changed, 6 insertions, 1 deletions
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp
index fa1c9152f4..d5dd776b7d 100644
--- a/lib/AST/Type.cpp
+++ b/lib/AST/Type.cpp
@@ -125,7 +125,7 @@ QualType Type::getDesugaredType(bool ForDisplay) const {
if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
return TOT->getUnderlyingType().getDesugaredType();
if (const DecltypeType *DTT = dyn_cast<DecltypeType>(this))
- return DTT->getUnderlyingExpr()->getType().getDesugaredType();
+ return DTT->getCanonicalTypeInternal();
if (const TemplateSpecializationType *Spec
= dyn_cast<TemplateSpecializationType>(this)) {
if (ForDisplay)
diff --git a/test/SemaCXX/decltype-crash.cpp b/test/SemaCXX/decltype-crash.cpp
new file mode 100644
index 0000000000..c16422e1ba
--- /dev/null
+++ b/test/SemaCXX/decltype-crash.cpp
@@ -0,0 +1,5 @@
+int& a();
+
+void f() {
+ decltype(a()) c;
+}