[clang] a1ebae0 - [CodeComplete] Only complete attributes that match the current LangOpts
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 19 04:35:29 PDT 2021
Author: Sam McCall
Date: 2021-08-19T13:35:07+02:00
New Revision: a1ebae08f4b243419738c3b3f0455160a880f861
URL: https://github.com/llvm/llvm-project/commit/a1ebae08f4b243419738c3b3f0455160a880f861
DIFF: https://github.com/llvm/llvm-project/commit/a1ebae08f4b243419738c3b3f0455160a880f861.diff
LOG: [CodeComplete] Only complete attributes that match the current LangOpts
Differential Revision: https://reviews.llvm.org/D108111
Added:
Modified:
clang/lib/Sema/SemaCodeComplete.cpp
clang/test/CodeCompletion/attr.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index e8e8fb209cc9..445ab4885cfa 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -4389,7 +4389,8 @@ void Sema::CodeCompleteAttribute(AttributeCommonInfo::Syntax Syntax,
auto AddCompletions = [&](const ParsedAttrInfo &A) {
if (A.IsTargetSpecific && !A.existsInTarget(Context.getTargetInfo()))
return;
- // FIXME: filter by langopts (diagLangOpts method requires a ParsedAttr)
+ if (!A.acceptsLangOpts(getLangOpts()))
+ return;
for (const auto &S : A.Spellings) {
if (S.Syntax != Syntax)
continue;
diff --git a/clang/test/CodeCompletion/attr.cpp b/clang/test/CodeCompletion/attr.cpp
index 61807cf4984c..782e5a1d75ec 100644
--- a/clang/test/CodeCompletion/attr.cpp
+++ b/clang/test/CodeCompletion/attr.cpp
@@ -7,11 +7,14 @@ int a [[gnu::used]];
// STD-NOT: COMPLETION: __used__
// STD: COMPLETION: _Clang::__convergent__
// STD: COMPLETION: carries_dependency
+// STD-NOT: COMPLETION: clang::called_once
// STD: COMPLETION: clang::convergent
// STD-NOT: COMPLETION: convergent
// STD-NOT: COMPLETION: gnu::__used__
// STD: COMPLETION: gnu::used
// STD-NOT: COMPLETION: used
+// RUN: %clang_cc1 -code-completion-at=%s:1:9 -xobjective-c++ %s | FileCheck --check-prefix=STD-OBJC %s
+// STD-OBJC: COMPLETION: clang::called_once
// RUN: %clang_cc1 -code-completion-at=%s:1:14 %s | FileCheck --check-prefix=STD-NS %s
// STD-NS-NOT: COMPLETION: __used__
// STD-NS-NOT: COMPLETION: carries_dependency
@@ -20,12 +23,12 @@ int a [[gnu::used]];
// STD-NS-NOT: COMPLETION: gnu::used
// STD-NS: COMPLETION: used
int b [[__gnu__::used]];
-// RUN: %clang_cc1 -code-completion-at=%s:22:18 %s | FileCheck --check-prefix=STD-NSU %s
+// RUN: %clang_cc1 -code-completion-at=%s:25:18 %s | FileCheck --check-prefix=STD-NSU %s
// STD-NSU: COMPLETION: __used__
// STD-NSU-NOT: COMPLETION: used
int c [[using gnu: used]];
-// RUN: %clang_cc1 -code-completion-at=%s:27:15 %s | FileCheck --check-prefix=STD-USING %s
+// RUN: %clang_cc1 -code-completion-at=%s:30:15 %s | FileCheck --check-prefix=STD-USING %s
// STD-USING: COMPLETION: __gnu__
// STD-USING: COMPLETION: _Clang
// STD-USING-NOT: COMPLETION: carries_dependency
@@ -33,10 +36,10 @@ int c [[using gnu: used]];
// STD-USING-NOT: COMPLETION: clang::
// STD-USING-NOT: COMPLETION: gnu::
// STD-USING: COMPLETION: gnu
-// RUN: %clang_cc1 -code-completion-at=%s:27:20 %s | FileCheck --check-prefix=STD-NS %s
+// RUN: %clang_cc1 -code-completion-at=%s:30:20 %s | FileCheck --check-prefix=STD-NS %s
int d __attribute__((used));
-// RUN: %clang_cc1 -code-completion-at=%s:38:22 %s | FileCheck --check-prefix=GNU %s
+// RUN: %clang_cc1 -code-completion-at=%s:41:22 %s | FileCheck --check-prefix=GNU %s
// GNU: COMPLETION: __carries_dependency__
// GNU: COMPLETION: __convergent__
// GNU-NOT: COMPLETION: __gnu__::__used__
@@ -51,12 +54,12 @@ int d __attribute__((used));
#pragma clang attribute push (__attribute__((internal_linkage)), apply_to=variable)
int e;
#pragma clang attribute pop
-// RUN: %clang_cc1 -code-completion-at=%s:51:46 %s | FileCheck --check-prefix=PRAGMA %s
+// RUN: %clang_cc1 -code-completion-at=%s:54:46 %s | FileCheck --check-prefix=PRAGMA %s
// PRAGMA: internal_linkage
#ifdef MS_EXT
int __declspec(thread) f;
-// RUN: %clang_cc1 -fms-extensions -DMS_EXT -code-completion-at=%s:58:16 %s | FileCheck --check-prefix=DS %s
+// RUN: %clang_cc1 -fms-extensions -DMS_EXT -code-completion-at=%s:61:16 %s | FileCheck --check-prefix=DS %s
// DS-NOT: COMPLETION: __convergent__
// DS-NOT: COMPLETION: __used__
// DS-NOT: COMPLETION: clang::convergent
@@ -66,7 +69,7 @@ int __declspec(thread) f;
// DS: COMPLETION: uuid
[uuid("123e4567-e89b-12d3-a456-426614174000")] struct g;
-// RUN: %clang_cc1 -fms-extensions -DMS_EXT -code-completion-at=%s:68:2 %s | FileCheck --check-prefix=MS %s
+// RUN: %clang_cc1 -fms-extensions -DMS_EXT -code-completion-at=%s:71:2 %s | FileCheck --check-prefix=MS %s
// MS-NOT: COMPLETION: __uuid__
// MS-NOT: COMPLETION: clang::convergent
// MS-NOT: COMPLETION: convergent
@@ -80,9 +83,9 @@ void foo() {
{}
}
// FIXME: support for omp attributes would be nice.
-// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:79:5 %s | FileCheck --check-prefix=OMP-NS --allow-empty %s
+// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:82:5 %s | FileCheck --check-prefix=OMP-NS --allow-empty %s
// OMP-NS-NOT: omp
-// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:79:10 %s | FileCheck --check-prefix=OMP-ATTR --allow-empty %s
+// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:82:10 %s | FileCheck --check-prefix=OMP-ATTR --allow-empty %s
// OMP-ATTR-NOT: sequence
-// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:79:19 %s | FileCheck --check-prefix=OMP-NESTED --allow-empty %s
+// RUN: %clang_cc1 -fopenmp -code-completion-at=%s:82:19 %s | FileCheck --check-prefix=OMP-NESTED --allow-empty %s
// OMP-NESTED-NOT: directive
More information about the cfe-commits
mailing list