Author: Haojian Wu Date: 2020-10-05T12:52:04+02:00 New Revision: 7f05fe1aeeb005b552c6a3093b61659e7b578b14
URL: https://github.com/llvm/llvm-project/commit/7f05fe1aeeb005b552c6a3093b61659e7b578b14 DIFF: https://github.com/llvm/llvm-project/commit/7f05fe1aeeb005b552c6a3093b61659e7b578b14.diff LOG: [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 Added: Modified: clang/lib/Sema/SemaOverload.cpp clang/test/AST/ast-dump-recovery.cpp clang/test/SemaCXX/recovery-expr-type.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 0c252a488fea..4696ed56dc71 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 fd7c923b7e51..69d5f80427cb 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 {{.*}} '<dependent type>' +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 075d0147c684..8186a812790d 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'}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits