[PATCH] D84322: [AST][RecoveryExpr] Part3: Support dependent conditional operators in C for error recovery.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 7 00:34:42 PDT 2020
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG334ec6f807fa: [AST][RecoveryExpr] Support dependent conditional operators in C for error… (authored by hokein).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84322/new/
https://reviews.llvm.org/D84322
Files:
clang/lib/Sema/SemaExpr.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
@@ -1,9 +1,15 @@
// RUN: %clang_cc1 -fsyntax-only -verify -frecovery-ast -fno-recovery-ast-type %s
-int call(int); // expected-note {{'call' declared here}}
+int call(int); // expected-note2 {{'call' declared here}}
void test1(int s) {
// verify "assigning to 'int' from incompatible type '<dependent type>'" is
// not emitted.
s = call(); // expected-error {{too few arguments to function call}}
}
+
+void test2(int* ptr, float f) {
+ // verify diagnostic "used type '<dependent type>' where arithmetic or pointer
+ // type is required" is not emitted.
+ (call() ? ptr : f); // expected-error {{too few arguments to function call}}
+}
Index: clang/test/AST/ast-dump-recovery.c
===================================================================
--- clang/test/AST/ast-dump-recovery.c
+++ clang/test/AST/ast-dump-recovery.c
@@ -71,4 +71,14 @@
// CHECK-NEXT: | `-DeclRefExpr {{.*}} 'some_func'
// CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1
some_func(), 1;
+
+ // conditional operator (comparison is invalid)
+ float f;
+ // CHECK: ConditionalOperator {{.*}} '<dependent type>' contains-errors
+ // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>'
+ // CHECK-NEXT: | |-DeclRefExpr {{.*}} 'int *' lvalue
+ // CHECK-NEXT: | `-DeclRefExpr {{.*}} 'float' lvalue
+ // CHECK-NEXT: |-DeclRefExpr {{.*}} 'int *' lvalue
+ // CHECK-NEXT: `-DeclRefExpr {{.*}} 'float' lvalue
+ (ptr > f ? ptr : f);
}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -8067,6 +8067,16 @@
VK = VK_RValue;
OK = OK_Ordinary;
+ if (Context.isDependenceAllowed() &&
+ (Cond.get()->isTypeDependent() || LHS.get()->isTypeDependent() ||
+ RHS.get()->isTypeDependent())) {
+ assert(!getLangOpts().CPlusPlus);
+ assert(Cond.get()->containsErrors() || LHS.get()->containsErrors() ||
+ RHS.get()->containsErrors() &&
+ "should only occur in error-recovery path.");
+ return Context.DependentTy;
+ }
+
// The OpenCL operator with a vector condition is sufficiently
// different to merit its own checker.
if ((getLangOpts().OpenCL && Cond.get()->getType()->isVectorType()) ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84322.296610.patch
Type: text/x-patch
Size: 2449 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201007/d6f1551e/attachment.bin>
More information about the cfe-commits
mailing list