forked from OSchip/llvm-project
[AST][RecoveryExpr] Support dependent cast-expr in C for error-recovery.
Suppress spurious "typecheck_cond_expect_scalar_operand" diagnostic. See whole context: https://reviews.llvm.org/D85025 Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D84387
This commit is contained in:
parent
ba268d2fb0
commit
a96bcfb196
|
@ -2707,6 +2707,17 @@ void CastOperation::CheckCStyleCast() {
|
||||||
return;
|
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.
|
// Overloads are allowed with C extensions, so we need to support them.
|
||||||
if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
|
if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
|
||||||
DeclAccessPair DAP;
|
DeclAccessPair DAP;
|
||||||
|
|
|
@ -81,4 +81,9 @@ void test2() {
|
||||||
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'int *' lvalue
|
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'int *' lvalue
|
||||||
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'float' lvalue
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'float' lvalue
|
||||||
(ptr > f ? ptr : f);
|
(ptr > f ? ptr : f);
|
||||||
|
|
||||||
|
// CHECK: CStyleCastExpr {{.*}} 'float' contains-errors <Dependent>
|
||||||
|
// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'
|
||||||
|
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func'
|
||||||
|
(float)some_func();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -frecovery-ast -fno-recovery-ast-type %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -frecovery-ast -fno-recovery-ast-type %s
|
||||||
|
|
||||||
int call(int); // expected-note2 {{'call' declared here}}
|
int call(int); // expected-note3 {{'call' declared here}}
|
||||||
|
|
||||||
void test1(int s) {
|
void test1(int s) {
|
||||||
// verify "assigning to 'int' from incompatible type '<dependent type>'" is
|
// verify "assigning to 'int' from incompatible type '<dependent type>'" is
|
||||||
// not emitted.
|
// not emitted.
|
||||||
s = call(); // expected-error {{too few arguments to function call}}
|
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) {
|
void test2(int* ptr, float f) {
|
||||||
|
|
Loading…
Reference in New Issue