[PATCH] D84387: [AST][RecoveryExpr] Part4: Suppress spurious "err_typecheck_expect_scalar_operand" diagnostic
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 7 00:39:28 PDT 2020
hokein updated this revision to Diff 296611.
hokein marked an inline comment as done.
hokein added a comment.
rebase
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84387/new/
https://reviews.llvm.org/D84387
Files:
clang/lib/Sema/SemaCast.cpp
clang/test/AST/ast-dump-recovery.c
clang/test/Sema/error-dependence.c
Index: clang/test/Sema/error-dependence.c
===================================================================
--- clang/test/Sema/error-dependence.c
+++ clang/test/Sema/error-dependence.c
@@ -6,6 +6,10 @@
// verify "assigning to 'int' from incompatible type '<dependent type>'" is
// not emitted.
s = call(); // expected-error {{too few arguments to function call}}
+
+ // verify diagnostic "operand of type '<dependent type>' where arithmetic or
+ // pointer type is required" is not emitted.
+ (float)call(); // expected-error {{too few arguments to function call}}
}
void test2(int* ptr, float f) {
Index: clang/test/AST/ast-dump-recovery.c
===================================================================
--- clang/test/AST/ast-dump-recovery.c
+++ clang/test/AST/ast-dump-recovery.c
@@ -81,4 +81,9 @@
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'int *' lvalue
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'float' lvalue
(ptr > f ? ptr : f);
+
+ // CHECK: CStyleCastExpr {{.*}} 'float' contains-errors <Dependent>
+ // CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'
+ // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'
+ (float)some_func();
}
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -2707,6 +2707,17 @@
return;
}
+ // If the type is dependent, we won't do any other semantic analysis now.
+ if (Self.getASTContext().isDependenceAllowed() &&
+ (DestType->isDependentType() || SrcExpr.get()->isTypeDependent() ||
+ SrcExpr.get()->isValueDependent())) {
+ assert((DestType->containsErrors() || SrcExpr.get()->containsErrors() ||
+ SrcExpr.get()->containsErrors()) &&
+ "should only occur in error-recovery path.");
+ assert(Kind == CK_Dependent);
+ return;
+ }
+
// Overloads are allowed with C extensions, so we need to support them.
if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
DeclAccessPair DAP;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84387.296611.patch
Type: text/x-patch
Size: 2034 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201007/fa8e738e/attachment.bin>
More information about the cfe-commits
mailing list