This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG7f05fe1aeeb0: [AST][RecoveryExpr] Fix a crash on undeduced type. (authored by hokein).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87350/new/ https://reviews.llvm.org/D87350 Files: clang/lib/Sema/SemaOverload.cpp clang/test/AST/ast-dump-recovery.cpp clang/test/SemaCXX/recovery-expr-type.cpp Index: clang/test/SemaCXX/recovery-expr-type.cpp =================================================================== --- clang/test/SemaCXX/recovery-expr-type.cpp +++ 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'}} +} Index: clang/test/AST/ast-dump-recovery.cpp =================================================================== --- clang/test/AST/ast-dump-recovery.cpp +++ 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 {{.*}} '<dependent type>' +int unknown_type_call = f(0, 0); + void InvalidInitalizer(int x) { struct Bar { Bar(); }; // CHECK: `-VarDecl {{.*}} a1 'Bar' Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ 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
Index: clang/test/SemaCXX/recovery-expr-type.cpp =================================================================== --- clang/test/SemaCXX/recovery-expr-type.cpp +++ 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'}} +} Index: clang/test/AST/ast-dump-recovery.cpp =================================================================== --- clang/test/AST/ast-dump-recovery.cpp +++ 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 {{.*}} '<dependent type>' +int unknown_type_call = f(0, 0); + void InvalidInitalizer(int x) { struct Bar { Bar(); }; // CHECK: `-VarDecl {{.*}} a1 'Bar' Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits