diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -12880,7 +12880,12 @@ for (const auto &C : CS) ConsiderCandidate(C); - return Result.getValueOr(QualType()); + if (!Result) + return QualType(); + auto Value = Result.getValue(); + if (Value.isNull() || Value->isUndeducedType()) + return QualType(); + return Value; } /// FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -126,6 +126,12 @@ // CHECK-NEXT:| `-UnresolvedLookupExpr {{.*}} 'invalid' struct alignas(invalid()) Aligned {}; +auto f(); +int f(double); +// CHECK: VarDecl {{.*}} unknown_type_call 'int' +// CHECK-NEXT: `-RecoveryExpr {{.*}} '' +int unknown_type_call = f(0, 0); + void InvalidInitalizer(int x) { struct Bar { Bar(); }; // CHECK: `-VarDecl {{.*}} a1 'Bar' diff --git a/clang/test/SemaCXX/recovery-expr-type.cpp b/clang/test/SemaCXX/recovery-expr-type.cpp --- a/clang/test/SemaCXX/recovery-expr-type.cpp +++ b/clang/test/SemaCXX/recovery-expr-type.cpp @@ -105,3 +105,9 @@ int v = arr(); // expected-error {{array types cannot be value-initialized}} \ expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'test8::arr'}} } + +namespace test9 { +auto f(); // expected-note {{candidate function not viable}} +// verify no crash on evaluating the size of undeduced auto type. +static_assert(sizeof(f(1)), ""); // expected-error {{no matching function for call to 'f'}} +}