urazoff updated this revision to Diff 476766.
urazoff added a comment.
- Added test for AST dump of invalid C code
- Added testcase for diagnostics
- Some minor fixes
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D137020/new/
https://reviews.llvm.org/D137020
Files:
clang/lib/Parse/ParseDecl.cpp
clang/test/AST/ast-dump-invalid.c
clang/test/AST/ast-dump-recovery.c
clang/test/Driver/types.c
clang/test/Parser/CompoundStmtScope.c
clang/test/Parser/opencl-atomics-cl20.cl
clang/test/Parser/recovery.c
clang/test/SemaOpenCL/intel-subgroup-avc-ext-types.cl
clang/test/SemaOpenCL/invalid-device-enqueue-types-cl3.0.cl
clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
Index: clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
===================================================================
--- clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
+++ clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
@@ -26,10 +26,5 @@
#endif
void bar(void) {
- reserve_id_t r;
-#if defined(__OPENCL_C_VERSION__)
-// expected-error@-2 {{use of undeclared identifier 'reserve_id_t'}}
-#else
-// expected-error@-4 {{unknown type name 'reserve_id_t'}}
-#endif
+ reserve_id_t r; // expected-error {{unknown type name 'reserve_id_t'}}
}
Index: clang/test/SemaOpenCL/invalid-device-enqueue-types-cl3.0.cl
===================================================================
--- clang/test/SemaOpenCL/invalid-device-enqueue-types-cl3.0.cl
+++ clang/test/SemaOpenCL/invalid-device-enqueue-types-cl3.0.cl
@@ -5,8 +5,8 @@
clk_event_t e;
queue_t q;
#ifndef __opencl_c_device_enqueue
-// expected-error@-3 {{use of undeclared identifier 'clk_event_t'}}
-// expected-error@-3 {{use of undeclared identifier 'queue_t'}}
+// expected-error@-3 {{unknown type name 'clk_event_t'}}
+// expected-error@-3 {{unknown type name 'queue_t'}}
#else
// expected-no-diagnostics
#endif
Index: clang/test/SemaOpenCL/intel-subgroup-avc-ext-types.cl
===================================================================
--- clang/test/SemaOpenCL/intel-subgroup-avc-ext-types.cl
+++ clang/test/SemaOpenCL/intel-subgroup-avc-ext-types.cl
@@ -46,19 +46,19 @@
// expected-error@-14 {{initializing '__private intel_sub_group_avc_ime_single_reference_streamin_t' with an expression of incompatible type '__private char'}}
// expected-error@-14 {{initializing '__private intel_sub_group_avc_ime_dual_reference_streamin_t' with an expression of incompatible type 'int'}}
#else
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_mce_payload_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_payload_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ref_payload_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_sic_payload_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_mce_result_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_result_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ref_result_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_sic_result_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_result_single_reference_streamout_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_result_dual_reference_streamout_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_dual_reference_streamin_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_single_reference_streamin_t'}}
-// expected-error@-28 {{use of undeclared identifier 'intel_sub_group_avc_ime_dual_reference_streamin_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_mce_payload_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_payload_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ref_payload_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_sic_payload_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_mce_result_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_result_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ref_result_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_sic_result_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_result_single_reference_streamout_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_result_dual_reference_streamout_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_dual_reference_streamin_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_single_reference_streamin_t'}}
+// expected-error@-28 {{unknown type name 'intel_sub_group_avc_ime_dual_reference_streamin_t'}}
#endif
}
@@ -75,13 +75,12 @@
// expected-error@-5 {{initializing '__private intel_sub_group_avc_ref_payload_t' with an expression of incompatible type '__private intel_sub_group_avc_ime_payload_t'}}
// expected-error@-3 {{assigning to '__private intel_sub_group_avc_sic_result_t' from incompatible type '__private intel_sub_group_avc_ime_result_t'}}
#else
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_mce_payload_t'}}
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_mce_payload_t'}}
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_ime_payload_t'}}
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_ref_payload_t'}}
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_sic_result_t'}}
-// expected-error@-11 {{use of undeclared identifier 'intel_sub_group_avc_ime_result_t'}}
-// expected-error@-11 {{use of undeclared identifier 'result_sic'}} expected-error@-11 {{use of undeclared identifier 'result_ime'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_mce_payload_t'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_mce_payload_t'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_ime_payload_t'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_ref_payload_t'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_sic_result_t'}}
+// expected-error@-11 {{unknown type name 'intel_sub_group_avc_ime_result_t'}}
#endif
}
Index: clang/test/Parser/recovery.c
===================================================================
--- clang/test/Parser/recovery.c
+++ clang/test/Parser/recovery.c
@@ -10,8 +10,8 @@
// Testcase derived from PR2692
static void f (char * (*g) (char **, int), char **p, ...) {
char *s;
- va_list v; // expected-error {{identifier}}
- s = g (p, __builtin_va_arg(v, int)); // expected-error {{identifier}}
+ va_list v; // expected-error {{unknown type name 'va_list'}}
+ s = g (p, __builtin_va_arg(v, int));
}
@@ -99,3 +99,12 @@
x = VALUE3 // expected-error{{expected ';' after expression}}
x = VALUE4(0) // expected-error{{expected ';' after expression}}
}
+
+void test3(void) {
+ unknown_t a; // expected-error {{unknown type name 'unknown_t'}}
+ unknown_t *b; // expected-error {{unknown type name 'unknown_t'}}
+ unknown_t const *c; // expected-error {{unknown type name 'unknown_t'}}
+ unknown_t volatile *d; // expected-error {{unknown type name 'unknown_t'}}
+ unknown_t __attribute__ ((aligned (16))) f; // expected-error {{unknown type name 'unknown_t'}}
+ int g = unknown_t * a; // expected-error {{use of undeclared identifier 'unknown_t'}}
+}
Index: clang/test/Parser/opencl-atomics-cl20.cl
===================================================================
--- clang/test/Parser/opencl-atomics-cl20.cl
+++ clang/test/Parser/opencl-atomics-cl20.cl
@@ -17,10 +17,10 @@
atomic_float f;
atomic_flag fl;
#if !defined(LANG_VER_OK)
-// expected-error@-5 {{use of undeclared identifier 'atomic_int'}}
-// expected-error@-5 {{use of undeclared identifier 'atomic_uint'}}
-// expected-error@-5 {{use of undeclared identifier 'atomic_float'}}
-// expected-error@-5 {{use of undeclared identifier 'atomic_flag'}}
+// expected-error@-5 {{unknown type name 'atomic_int'}}
+// expected-error@-5 {{unknown type name 'atomic_uint'}}
+// expected-error@-5 {{unknown type name 'atomic_float'}}
+// expected-error@-5 {{unknown type name 'atomic_flag'}}
#endif
// Optional types
@@ -35,28 +35,26 @@
// one of the extensions is not supported. Here we check with
// `cl_khr_int64_base_atomics` only.
#if !defined(LANG_VER_OK) || !defined(cl_khr_int64_base_atomics)
-// expected-error@-11 {{use of undeclared identifier 'atomic_long'}}
-// expected-error@-11 {{use of undeclared identifier 'atomic_ulong'}}
-// expected-error@-11 {{use of undeclared identifier 'atomic_double'}}
-#if defined(LANG_VER_OK)
-// expected-error@-15 {{expected ';' after expression}}
-// expected-error@-16 {{use of undeclared identifier 'l'}}
-// expected-error@-16 {{expected ';' after expression}}
-// expected-error@-17 {{use of undeclared identifier 'ul'}}
-#endif
+// expected-error@-11 {{unknown type name 'atomic_long'}}
+// expected-error@-11 {{unknown type name 'atomic_ulong'}}
+// expected-error@-11 {{unknown type name 'atomic_double'}}
#if !defined(LANG_VER_OK) || defined(__SPIR64__)
-// expected-error@-18 {{use of undeclared identifier 'atomic_size_t'}}
-// expected-error@-16 {{use of undeclared identifier 'atomic_ptrdiff_t'}}
-#if !defined(LANG_VER_OK)
-// expected-error@-20 {{use of undeclared identifier 'atomic_intptr_t'}}
-// expected-error@-20 {{use of undeclared identifier 'atomic_uintptr_t'}}
+// expected-error@-12 {{unknown type name 'atomic_size_t'}}
+// expected-error@-12 {{unknown type name 'atomic_intptr_t'}}
+#if !defined(LANG_VER_OK) && defined(__SPIR64__)
+// expected-error@-14 {{unknown type name 'atomic_intptr_t'; did you mean 'atomic_int'?}}
+// expected-note@* {{'atomic_int' declared here}}
+// expected-error@-16 {{unknown type name 'atomic_uintptr_t'}}
+// expected-error@-16 {{unknown type name 'atomic_ptrdiff_t'}}
#else
-// expected-error@-24 {{expected ';' after expression}}
-// expected-error@-25 {{use of undeclared identifier 's'}}
-// expected-error@-25 {{unknown type name 'atomic_intptr_t'; did you mean 'atomic_int'?}}
+#if defined(LANG_VER_OK)
// expected-note@* {{'atomic_int' declared here}}
-// expected-error@-26 {{unknown type name 'atomic_uintptr_t'; did you mean 'atomic_uint'?}}
+// expected-error@-20 {{unknown type name 'atomic_uintptr_t'; did you mean 'atomic_uint'?}}
// expected-note@* {{'atomic_uint' declared here}}
+#else
+// expected-error@-23 {{unknown type name 'atomic_uintptr_t'}}
+#endif
+// expected-error@-24 {{unknown type name 'atomic_ptrdiff_t'}}
#endif
#endif
#endif
Index: clang/test/Parser/CompoundStmtScope.c
===================================================================
--- clang/test/Parser/CompoundStmtScope.c
+++ clang/test/Parser/CompoundStmtScope.c
@@ -4,5 +4,5 @@
{
typedef float X;
}
- X Y; // expected-error {{use of undeclared identifier}}
+ X Y; // expected-error {{unknown type name 'X'}}
}
Index: clang/test/Driver/types.c
===================================================================
--- clang/test/Driver/types.c
+++ clang/test/Driver/types.c
@@ -20,5 +20,5 @@
__uint128_t t;
}
-// CHECK: error: use of undeclared identifier '__int128_t'
-// CHECK: error: use of undeclared identifier '__uint128_t'
+// CHECK: error: unknown type name '__int128_t'
+// CHECK: error: unknown type name '__uint128_t'
Index: clang/test/AST/ast-dump-recovery.c
===================================================================
--- clang/test/AST/ast-dump-recovery.c
+++ clang/test/AST/ast-dump-recovery.c
@@ -98,3 +98,11 @@
// CHECK-NEXT: `-RecoveryExpr {{.*}} '<dependent type>'
ext(undef_var);
}
+
+void RecoverToAnInvalidDecl() {
+ Unknown* foo; // invalid decl
+ foo;
+ // Verify that RecoveryExpr has an inner DeclRefExpr.
+ // CHECK: RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue
+ // CHECK-NEXT: `-DeclRefExpr {{.*}} 'foo' 'int *'
+}
Index: clang/test/AST/ast-dump-invalid.c
===================================================================
--- /dev/null
+++ clang/test/AST/ast-dump-invalid.c
@@ -0,0 +1,14 @@
+// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -fno-recovery-ast-type -ast-dump %s | FileCheck -strict-whitespace %s
+
+void test1() {
+ unknown_t a;
+ // CHECK: VarDecl{{.*}} invalid a 'int'
+ unknown_t *b;
+ // CHECK: VarDecl{{.*}} invalid b 'int *'
+ unknown_t const *c;
+ // CHECK: VarDecl{{.*}} invalid c 'const int *'
+ unknown_t volatile *d;
+ // CHECK: VarDecl{{.*}} invalid d 'volatile int *'
+ unknown_t __attribute__ ((aligned (16))) f;
+ // CHECK: VarDecl{{.*}} invalid f 'int'
+}
\ No newline at end of file
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -5381,6 +5381,24 @@
}
}
+static bool IsUnknownTypedefName(Parser &P) {
+ switch (P.NextToken().getKind()) {
+ default:
+ return false;
+ case tok::kw___attribute:
+ case tok::kw_const:
+ case tok::kw_volatile:
+ case tok::star:
+ case tok::identifier:
+ return true;
+ case tok::amp:
+ case tok::ampamp:
+ case tok::kw___declspec:
+ case tok::l_square:
+ return P.getLangOpts().CPlusPlus;
+ }
+}
+
/// isDeclarationSpecifier() - Return true if the current token is part of a
/// declaration specifier.
///
@@ -5405,6 +5423,12 @@
return false;
if (TryAltiVecVectorToken())
return true;
+ // Handle things like "unknown *bar;" as declaration for better
+ // diagnostics. Also it leads to creation of invalid declaration
+ // node in AST for such cases which is good for AST consumers.
+ if (DisambiguatingWithExpression && IsUnknownTypedefName(*this) &&
+ !getLangOpts().ObjC)
+ return true;
[[fallthrough]];
case tok::kw_decltype: // decltype(T())::type
case tok::kw_typename: // typename T::type
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits