From 7f05fe1aeeb005b552c6a3093b61659e7b578b14 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 5 Oct 2020 12:52:03 +0200 Subject: [PATCH] [AST][RecoveryExpr] Fix a crash on undeduced type. We should not capture the type if the function return type is undeduced. Reviewed By: adamcz Differential Revision: https://reviews.llvm.org/D87350 --- clang/lib/Sema/SemaOverload.cpp | 7 ++++++- clang/test/AST/ast-dump-recovery.cpp | 6 ++++++ clang/test/SemaCXX/recovery-expr-type.cpp | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 0c252a4..4696ed5 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -12880,7 +12880,12 @@ static QualType chooseRecoveryType(OverloadCandidateSet &CS, 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 index fd7c923..69d5f80 100644 --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -126,6 +126,12 @@ void test(int x) { // 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 index 075d014..8186a81 100644 --- a/clang/test/SemaCXX/recovery-expr-type.cpp +++ b/clang/test/SemaCXX/recovery-expr-type.cpp @@ -105,3 +105,9 @@ typedef int arr[]; 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'}} +} -- 2.7.4