Author: Haojian Wu Date: 2021-01-22T13:04:37+01:00 New Revision: d972d4c749048531953a16b815e07c67e8455a3b
URL: https://github.com/llvm/llvm-project/commit/d972d4c749048531953a16b815e07c67e8455a3b DIFF: https://github.com/llvm/llvm-project/commit/d972d4c749048531953a16b815e07c67e8455a3b.diff LOG: Revert "[clang] Suppress "follow-up" diagnostics on recovery call expressions." This reverts commit efa9aaad703e6b150980ed1a74b4e7c9da7d85a2 and adds a crash test. The commit caused a crash in CodeGen with -fms-compatibility, see https://bugs.llvm.org/show_bug.cgi?id=48690. Added: clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp Modified: clang/lib/Sema/SemaOverload.cpp clang/test/AST/ast-dump-recovery.cpp clang/test/SemaCXX/typo-correction-delayed.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 13d2125d1a28..2bef37b76763 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -12923,7 +12923,7 @@ BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, return ExprError(); } - // Build an implicit member access expression if appropriate. Just drop the + // Build an implicit member call if appropriate. Just drop the // casts and such from the call, we don't really care. ExprResult NewFn = ExprError(); if ((*R.begin())->isCXXClassMember()) @@ -12938,19 +12938,12 @@ BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, if (NewFn.isInvalid()) return ExprError(); - auto CallE = - SemaRef.BuildCallExpr(/*Scope*/ nullptr, NewFn.get(), LParenLoc, - MultiExprArg(Args.data(), Args.size()), RParenLoc); - if (CallE.isInvalid()) - return ExprError(); - // We now have recovered a callee. However, building a real call may lead to - // incorrect secondary diagnostics if our recovery wasn't correct. - // We keep the recovery behavior but suppress all following diagnostics by - // using RecoveryExpr. We deliberately drop the return type of the recovery - // function, and rely on clang's dependent mechanism to suppress following - // diagnostics. - return SemaRef.CreateRecoveryExpr(CallE.get()->getBeginLoc(), - CallE.get()->getEndLoc(), {CallE.get()}); + // This shouldn't cause an infinite loop because we're giving it + // an expression with viable lookup results, which should never + // end up here. + return SemaRef.BuildCallExpr(/*Scope*/ nullptr, NewFn.get(), LParenLoc, + MultiExprArg(Args.data(), Args.size()), + RParenLoc); } /// Constructs and populates an OverloadedCandidateSet from diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp index a8da2b8ad449..b6d7ac1d0a8e 100644 --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -296,14 +296,3 @@ void InvalidCondition() { // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 2 invalid() ? 1 : 2; } - -void abcc(); -void TypoCorrection() { - // RecoveryExpr is always dependent-type in this case in order to suppress - // following diagnostics. - // CHECK: RecoveryExpr {{.*}} '<dependent type>' - // CHECK-NEXT: `-CallExpr {{.*}} 'void' - // CHECK-NEXT: `-ImplicitCastExpr - // CHECK-NEXT: `-DeclRefExpr {{.*}} 'abcc' - abc(); -} diff --git a/clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp b/clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp new file mode 100644 index 000000000000..fbc211aca17a --- /dev/null +++ b/clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-obj -fms-compatibility %s -o - +// CHECK that we don't crash. + +struct Base { + void b(int, int); +}; + +template <typename Base> struct Derived : Base { + void d() { b(1, 2); } +}; + +void use() { + Derived<Base> d; + d.d(); +} diff --git a/clang/test/SemaCXX/typo-correction-delayed.cpp b/clang/test/SemaCXX/typo-correction-delayed.cpp index aa136a08be4f..66d19daf66fd 100644 --- a/clang/test/SemaCXX/typo-correction-delayed.cpp +++ b/clang/test/SemaCXX/typo-correction-delayed.cpp @@ -209,15 +209,6 @@ int z = 1 ? N : ; // expected-error {{expected expression}} // expected-error-re@-1 {{use of undeclared identifier 'N'{{$}}}} } -namespace noSecondaryDiags { -void abcc(); // expected-note {{'abcc' declared here}} - -void test() { - // Verify the secondary diagnostic ".. convertible to 'bool'" is suppressed. - if (abc()) {} // expected-error {{use of undeclared identifier 'abc'; did you mean 'abcc'?}} -} -} - // PR 23285. This test must be at the end of the file to avoid additional, // unwanted diagnostics. // expected-error-re@+2 {{use of undeclared identifier 'uintmax_t'{{$}}}} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits