diff options
-rw-r--r-- | lib/AST/Type.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/decltype-crash.cpp | 5 |
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; +} |