Author: Devajith
Date: 2026-03-12T14:23:50+01:00
New Revision: 86c4e96856a645a4015adf0e4d1a779e5662c6ca

URL: 
https://github.com/llvm/llvm-project/commit/86c4e96856a645a4015adf0e4d1a779e5662c6ca
DIFF: 
https://github.com/llvm/llvm-project/commit/86c4e96856a645a4015adf0e4d1a779e5662c6ca.diff

LOG: [clang][AST] Fix assertion in `getFullyQualifiedType` for AutoType 
(#186105)

getFullyQualifiedType() asserts "Unhandled type node" when the input
QualType is an AutoType.

This was exposed by clang-repl's value printer:
```
clang-repl> namespace N { struct D {}; }
clang-repl> auto x = N::D(); x // asserts
```

Strip AutoType early before the type-specific handling.

Added: 
    

Modified: 
    clang/lib/AST/QualTypeNames.cpp
    clang/test/Interpreter/pretty-print.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/QualTypeNames.cpp b/clang/lib/AST/QualTypeNames.cpp
index 191841649a86f..9e3885e100c6b 100644
--- a/clang/lib/AST/QualTypeNames.cpp
+++ b/clang/lib/AST/QualTypeNames.cpp
@@ -369,6 +369,11 @@ NestedNameSpecifier createNestedNameSpecifier(const 
ASTContext &Ctx,
 /// versions of any template parameters.
 QualType getFullyQualifiedType(QualType QT, const ASTContext &Ctx,
                                bool WithGlobalNsPrefix) {
+  // Use the underlying deduced type for AutoType
+  if (const auto *AT = dyn_cast<AutoType>(QT.getTypePtr()))
+    if (AT->isDeduced())
+      QT = AT->getDeducedType();
+
   // In case of myType* we need to strip the pointer first, fully
   // qualify and attach the pointer once again.
   if (isa<PointerType>(QT.getTypePtr())) {

diff  --git a/clang/test/Interpreter/pretty-print.cpp 
b/clang/test/Interpreter/pretty-print.cpp
index bad71cdd48f0b..f0548358d65db 100644
--- a/clang/test/Interpreter/pretty-print.cpp
+++ b/clang/test/Interpreter/pretty-print.cpp
@@ -60,6 +60,15 @@ struct S5 { int foo() { return 42; }};
 &S5::foo
 // CHECK-NEXT: (int (S5::*)()) Function @0x{{[0-9a-f]+}}
 
+// Namespaced types deduced via auto
+namespace Outer { struct Foo {}; }
+auto x = Outer::Foo(); x
+// CHECK-NEXT: (Outer::Foo &) @0x{{[0-9a-f]+}}
+
+namespace Outer { template<class T> struct Bar {}; }
+auto y = Outer::Bar<int>(); y
+// CHECK-NEXT: (Outer::Bar<int> &) @0x{{[0-9a-f]+}}
+
 // int i = 12;
 // int &iref = i;
 // iref


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to