[PATCH] D100739: [Coroutines] Handle overaligned frame allocation (2)

2021-04-25 Thread Chuanqi Xu via Phabricator via cfe-commits
ChuanqiXu added a comment.

In D100739#2713579 , @ychen wrote:

> In D100739#2711698 , @ChuanqiXu 
> wrote:
>
>>> This is an alternative to D97915  which 
>>> missed proper deallocation of the over-allocated frame. This patch handles 
>>> both allocations and deallocations.
>>
>> If D97915  is not needed, we should abandon 
>> it.
>>
>> For the example shows in D97915 , it says:
>>
>>   #include 
>>   #include 
>>   #include 
>>   #include 
>>   #include 
>>   
>>   struct task{
>> struct alignas(64) promise_type {
>>   task get_return_object() { return {}; }
>>   std::experimental::suspend_never initial_suspend() { return {}; }
>>   std::experimental::suspend_never final_suspend() noexcept { return {}; 
>> }
>>   void return_void() {}
>>   void unhandled_exception() {}
>> };
>> using handle = std::experimental::coroutine_handle;
>>   };
>>   
>>   auto switch_to_new_thread() {
>> struct awaitable {
>>   bool await_ready() { return false; }
>>   void await_suspend(task::handle h) {
>> auto i = reinterpret_cast(&h.promise());
>> std::cout << i << std::endl;
>> assert(i % 64 == 0);
>>   }
>>   void await_resume() {}
>> };
>> return awaitable{};
>>   }
>>   
>>   task resuming_on_new_thread() {
>> co_await switch_to_new_thread();
>>   }
>>   
>>   int main() {
>> resuming_on_new_thread();
>>   }
>>
>> The assertion would fail. If this is the root problem, I think we could 
>> adjust the align for the promise alloca like:
>
> The problem is that any member of the coroutine frame could be overaligned 
> (thus make the frame overaligned) including promise, local variables, spills. 
> The problem is *not* specific to promise.
>
>>   %promise = alloca %promise_type, align 8
>>
>> into
>>
>>   %promise = alloca %promise_type, align 128
>>
>> In other words, if this the problem we need to solve, I think we could make 
>> it in a simpler way.
>
> This may not fix the problem.
>
>> Then I looked into the document you give in the summary. The issue#3 says 
>> the frontend can't do some work in the process of template instantiation due 
>> to the frontend doesn't know about the align and size of the coroutine. But 
>> from the implementation, it looks like not the problem this patch wants to 
>> solve.
>
> I meant to use that as a reference to help describe the problem (but not the 
> solution). The document itself includes both problem statements (issue#3) and 
> solutions (frontend-based) which are totally unrelated to this patch. It 
> looks like it is not that useful in this case so please disregard that.
>
>> I am really confused about the problem. Could you please restate your 
>> problem more in more detail? For example, would it make the alignment 
>> incorrect like the example above? Or does we want the frontend to get 
>> alignment information? Then what would be affected? From the title, I can 
>> guess the size of frame would get bigger. But how big would it be? Who would 
>> control and determine the final size?
>
> understood.
>
> There are two kinds of alignments: the alignment of a type/object at 
> compile-time (ABI specified or user-specified), and the alignment the object 
> of that type actually gets during runtime. The compiler assumes that the 
> alignment of a struct is the maximal alignment of all its members. However, 
> that assumption may not be true at runtime where the memory allocator may 
> return a memory block that has insufficient alignment which causes some 
> members aligned incorrectly.
>
> For C++ coroutine, right now the default memory allocator could only return 
> 16 bytes aligned memory block. When any member of the coroutine frame 
> (promise, local variables, spills etc.) has alignment > 16, the frame becomes 
> overaligned. This could only be fixed dynamically at runtime: by 
> over-allocating memory and then adjust the frame start address so that it 
> aligns correctly.
>
> For example, suppose malloc returns 16 bytes aligned address 16, how do we 
> make it 64 bytes aligned? align 16 up to an address that is 64 bytes aligned 
> which is 64, so the adjustment amount is 64-16=48
>
> Another similar example, suppose malloc returns 16 bytes aligned address 32, 
> how do we make it 64 bytes aligned? align 32 up to an address that is 64 
> bytes aligned which is 64, so the adjustment amount is 64-32=32
>
> Another similar example, suppose malloc returns 16 bytes aligned address 48, 
> how do we make it 64 bytes aligned? align 48 up to an address that is 64 
> bytes aligned which is 64, so the adjustment amount is 64-48=16
>
> Another similar example, suppose malloc returns 16 bytes aligned address 64, 
> how do we make it 64 bytes aligned? align 64 up to an address that is 64 
> bytes aligned which is 64, so t

[PATCH] D101041: [analyzer] Find better description for tracked symbolic values

2021-04-25 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ added inline comments.



Comment at: clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp:163-165
+  ProgramStateManager &StateMgr = N->getState()->getStateManager();
+  MemRegionManager &MRMgr = StateMgr.getRegionManager();
+  return MRMgr.getVarRegion(VD, N->getLocationContext());

This isn't your code but it came to my attention that there's a convenient (but 
equally confusing) shortcut for this:
```lang=c++
return N->getState()->getLValue(VD, N->getLocationContext());
```



Comment at: clang/test/Analysis/uninit-const.cpp:78
   int t;   //expected-note {{'t' declared without an initial value}}
-  int &p = t;  //expected-note {{'p' initialized here}}
-  int &s = p;  //expected-note {{'s' initialized here}}
-  int &q = s;  //expected-note {{'q' initialized here}}
+  int &p = t;  //expected-note {{'p' initialized to the value of 't'}}
+  int &s = p;  //expected-note {{'s' initialized to the value of 'p'}}

I suspect that this wording can be improved a lot. The note "`'p' initialized 
to the value of 't'`" sounds like an accurate description for `int p = t` but 
not so much for `int &p = t`. Can we detect this case and say something like 
"`'p' refers to 't'`" instead?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101041/new/

https://reviews.llvm.org/D101041

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100742: [clangd] Parameter hints for dependent calls

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge added a reviewer: sammccall.
nridge added inline comments.



Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:264
+// FIXME: This one does not work yet.
+A::static_member($par3[[t]]);
   }

This is an interesting case. Clang builds a `CXXDependentScopeMemberExpr` for 
this callee, but `HeuristicResolver` [currently 
assumes](https://searchfox.org/llvm/rev/92880ab7a2b2145f0605f367cd6d53d6892903c3/clang-tools-extra/clangd/HeuristicResolver.cpp#108)
 that such expressions are only built for non-static member accesses (since, 
for static member accesses, clang usually builds a `DependentScopeDeclRefExpr` 
instead).

The `CXXDependentScopeMemberExpr` is created 
[here](https://searchfox.org/llvm/rev/92880ab7a2b2145f0605f367cd6d53d6892903c3/clang/lib/Sema/SemaTemplate.cpp#757),
 and I note the dependence on whether the //enclosing context// is an [instance 
method](https://searchfox.org/llvm/rev/92880ab7a2b2145f0605f367cd6d53d6892903c3/clang/lib/Sema/SemaTemplate.cpp#750).
 I guess it must think that, after instantiation, `A` could turn out to be a 
base class, and thus this could be a "non-static member access with qualifier".

I don't see anything obvious on `CXXDependentScopeMemberExpr` that would let us 
tell apart "definitely a non-static member" from "maybe static, maybe 
non-static", so I guess the appropriate solution is to drop the 
`NonStaticFilter` 
[here](https://searchfox.org/llvm/rev/92880ab7a2b2145f0605f367cd6d53d6892903c3/clang-tools-extra/clangd/HeuristicResolver.cpp#108)
 altogether?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100742/new/

https://reviews.llvm.org/D100742

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100742: [clangd] Parameter hints for dependent calls

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340439.
nridge added a comment.
Herald added a subscriber: cfe-commits.

Add some more test cases


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100742/new/

https://reviews.llvm.org/D100742

Files:
  clang-tools-extra/clangd/HeuristicResolver.cpp
  clang-tools-extra/clangd/HeuristicResolver.h
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -244,19 +244,29 @@
ExpectedHint{"p3: ", "p3"});
 }
 
-TEST(ParameterHints, DependentCall) {
-  // FIXME: This doesn't currently produce a hint but should.
+TEST(ParameterHints, DependentCalls) {
   assertParameterHints(R"cpp(
 template 
-void foo(T param);
+void nonmember(T par1);
+
+template 
+struct A {
+  void member(T par2);
+  static void static_member(T par3);
+};
 
 template 
 struct S {
-  void bar(T par) {
-foo($param[[par]]);
+  void bar(A a, T t) {
+nonmember($par1[[t]]);
+a.member($par2[[t]]);
+// FIXME: This one does not work yet.
+A::static_member($par3[[t]]);
   }
 };
-  )cpp");
+  )cpp",
+   ExpectedHint{"par1: ", "par1"},
+   ExpectedHint{"par2: ", "par2"});
 }
 
 TEST(ParameterHints, VariadicFunction) {
@@ -362,4 +372,4 @@
 
 } // namespace
 } // namespace clangd
-} // namespace clang
+} // namespace clang
\ No newline at end of file
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -6,6 +6,7 @@
 //
 //===--===//
 #include "InlayHints.h"
+#include "HeuristicResolver.h"
 #include "ParsedAST.h"
 #include "support/Logger.h"
 #include "clang/AST/DeclarationName.h"
@@ -20,7 +21,8 @@
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
   : Results(Results), AST(AST.getASTContext()),
-MainFileID(AST.getSourceManager().getMainFileID()) {
+MainFileID(AST.getSourceManager().getMainFileID()),
+Resolver(AST.getHeuristicResolver()) {
 bool Invalid = false;
 llvm::StringRef Buf =
 AST.getSourceManager().getBufferData(MainFileID, &Invalid);
@@ -50,9 +52,18 @@
 if (isa(E) || isa(E))
   return true;
 
-processCall(E->getRParenLoc(),
-dyn_cast_or_null(E->getCalleeDecl()),
-{E->getArgs(), E->getNumArgs()});
+auto CalleeDecls = Resolver->resolveCalleeOfCallExpr(E);
+if (CalleeDecls.empty())
+  return true;
+const FunctionDecl *Callee = nullptr;
+if (const auto *FD = dyn_cast(CalleeDecls[0]))
+  Callee = FD;
+else if (const auto *FTD = dyn_cast(CalleeDecls[0]))
+  Callee = FTD->getTemplatedDecl();
+if (!Callee)
+  return true;
+
+processCall(E->getRParenLoc(), Callee, {E->getArgs(), E->getNumArgs()});
 return true;
   }
 
@@ -266,6 +277,7 @@
   ASTContext &AST;
   FileID MainFileID;
   StringRef MainFileBuf;
+  const HeuristicResolver *Resolver;
 };
 
 std::vector inlayHints(ParsedAST &AST) {
Index: clang-tools-extra/clangd/HeuristicResolver.h
===
--- clang-tools-extra/clangd/HeuristicResolver.h
+++ clang-tools-extra/clangd/HeuristicResolver.h
@@ -56,6 +56,8 @@
   std::vector
   resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
+  resolveCalleeOfCallExpr(const CallExpr *CE) const;
+  std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector
   resolveDependentNameType(const DependentNameType *DNT) const;
@@ -87,6 +89,7 @@
   // Try to heuristically resolve the type of a possibly-dependent expression
   // `E`.
   const Type *resolveExprToType(const Expr *E) const;
+  std::vector resolveExprToDecls(const Expr *E) const;
 
   // Given the type T of a dependent expression that appears of the LHS of a
   // "->", heuristically find a corresponding pointee type in whose scope we
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -130,6 +130,15 @@
   return {};
 }
 
+std::vector
+HeuristicResolver::resolveCalleeOfCallExpr(const CallExpr *CE) const {
+  if (const auto *ND = dyn_cast_or_null(CE->getCalleeDecl())) {
+return {ND};
+  }
+
+  return resolveExprToDecls(CE->getCallee());
+}
+
 std::vector HeuristicResolver::resolveUsingValueDecl(
 const UnresolvedUsingValueDecl *UUVD) const

[PATCH] D100852: [analyzer] Track leaking object through stores

2021-04-25 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ accepted this revision.
NoQ added inline comments.
This revision is now accepted and ready to land.



Comment at: 
clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp:636
 if (isa(R))
-  Result.push_back(R);
+  Result.emplace_back(R, Val);
 

vsavchenko wrote:
> NoQ wrote:
> > Because we already know that `Val.getAsLocSymbol()` is equal to `Sym`, we 
> > can be certain that `Val` is either a `&SymRegion{Sym}` (i.e., literally 
> > this symbol in its pristine representation) or, in some rare cases, a 
> > `LocAsInteger` over that (which is a case i'm not sure we even want to 
> > handle). I dunno if we really need to return it here. Maybe it's easier to 
> > re-construct it in place as `SValBuilder.makeLoc(Sym)`.
> Oh, that was my original solution, but it doesn't work for dynamic casts.
> This check compares symbols, but `FindLastStore` compares `SVal`s.  
> `&Derived{&SymRegion}` is not the same as `&SymRegion` and we fail.
> So, instead of hacking on the result from `SValBuilder` trying to make 
> something that will indeed match the last stored value, I save that last 
> stored value here, so we're guaranteed that `FindLastStore` will work as 
> intended.
Oh, C++. Indeed. Our pointer cast representation strikes again. Ok then!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100852/new/

https://reviews.llvm.org/D100852

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100839: [analyzer] Adjust the reported variable name in retain count checker

2021-04-25 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ added inline comments.



Comment at: 
clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp:967-968
+
+  // While looking for the last var bindings, we can still find
+  // `AllocFirstBinding` to be one of them.  In situations like this,
+  // it would still be the easiest case to explain to our users.

vsavchenko wrote:
> NoQ wrote:
> > Given that the current state doesn't satisfy the requirement on line 945, 
> > this can happen for two reasons:
> > 1. The symbol was there when the variable died so we simply tracked it back 
> > to the last moment of time the variable was alive.
> > 2. The symbol was there but was overwritten later (and then the variable 
> > may have also, but haven't necessarily, died).
> > 
> > Case 2 is bad because we're back in business for reporting the wrong 
> > variable; it's still more rare than before the patch but i think the 
> > problem remains. Something like this should probably demonstrate it:
> > 
> > ```lang=c++
> > void foo() {
> >   Object *Original = allocate(...);
> >   Original = allocate();
> >   Original->release();
> > }
> > ```
> > 
> > A potential solution may be to add a check in `getAllVarBindingsForSymbol` 
> > that the first node in which we find our symbol corresponds to a 
> > `*PurgeDeadSymbols` program point. It's a straightforward way to find out 
> > whether we're in case 1 or in case 2.
> In this situation, we will report on line `Original = allocate();`, which 
> should probably be a good enough indicator of what analyzer tries to say.
> In your example, we have a choice of either not report variable name at all 
> or report `Original`
I had a look and it looks like all of our UIs are acting up quite a bit on this 
example. The user ends up completely convinced that it's the current value of 
`Original` that's getting leaked, not the original value.

Let's at least add a test and/or a comment? This definitely isn't a regression 
and the patch is still really good.



Comment at: 
clang/test/Analysis/Inputs/expected-plists/retain-release-path-notes.m.plist:5993
+ message
+ Object leaked: object allocated and stored into 'New' 
is not referenced later in this execution path and has a retain count of 
+1
+

vsavchenko wrote:
> NoQ wrote:
> > This patch seems to add 3 entirely new warnings here. Why do they suddenly 
> > start showing up? Are they good?
> Because I added 3 more test cases? 😅
Uh-oh ok fair enough :D


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100839/new/

https://reviews.llvm.org/D100839

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D99646: [clang-tidy] misc-avoid-std-io-outside-main: a new check

2021-04-25 Thread Marco Gartmann via Phabricator via cfe-commits
mgartmann added a comment.

Friendly ping :)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99646/new/

https://reviews.llvm.org/D99646

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D79714: [Diagnostics] Restore -Wdeprecated warning when user-declared copy assignment operator is defined as deleted (PR45634)

2021-04-25 Thread Mikael Holmén via Phabricator via cfe-commits
uabelho added a comment.

In D79714#2713610 , @xbolva00 wrote:

> I pushed a fix to just disable this warning for googlemock/gtest.

Unfortunately that fix breaks compiling llvm with clang8. I commented in
 https://reviews.llvm.org/rG9658d045926545e62cc3f963fe611d7c5d0c9d98


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79714/new/

https://reviews.llvm.org/D79714

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101209: [PowerPC] Provide fastmath sqrt and div functions in altivec.h

2021-04-25 Thread Qiu Chaofan via Phabricator via cfe-commits
qiucf added inline comments.



Comment at: clang/lib/CodeGen/CGBuiltin.cpp:15122
+  case PPC::BI__builtin_ppc_rsqrtd: {
+auto FMF = Builder.getFastMathFlags();
+Builder.getFastMathFlags().setFast();

Seems FMF will be automatically restored without the three lines.

```
vector float test_recipdivd(vector float a, vector float b) {
  vector float x = vec_recipdiv(a, b);
  vector float y = x + b;
  return y;
}
```

```
define dso_local <4 x float> @test_recipdivd(<4 x float> %a, <4 x float> %b) {
entry:
  %recipdiv.i = fdiv fast <4 x float> %a, %b
  %add = fadd <4 x float> %recipdiv.i, %b
  ret <4 x float> %add
}
```

See https://reviews.llvm.org/D96231#inline-901337.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101209/new/

https://reviews.llvm.org/D101209

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D99741: [RISCV][Clang] Add some RVV Floating-Point intrinsic functions. (vfclass, vfmerge, vfrec7, vfrsqrt7, vfsqrt)

2021-04-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen added a comment.

@thakis 
https://reviews.llvm.org/D100611 had landed, could you check your bot to see 
the cycle time?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99741/new/

https://reviews.llvm.org/D99741

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101275: [clangd] Hide inlay hints capability behind a command-line flag

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge created this revision.
nridge added a reviewer: sammccall.
Herald added subscribers: usaxena95, kadircet, arphaman.
nridge requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101275

Files:
  clang-tools-extra/clangd/ClangdLSPServer.cpp
  clang-tools-extra/clangd/ClangdServer.h
  clang-tools-extra/clangd/tool/ClangdMain.cpp


Index: clang-tools-extra/clangd/tool/ClangdMain.cpp
===
--- clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -307,6 +307,10 @@
 Hidden,
 };
 
+opt InlayHints{"inlay-hints", cat(Features),
+ desc("Enable preview of InlayHints feature"), init(false),
+ Hidden};
+
 opt WorkerThreadsCount{
 "j",
 cat(Misc),
@@ -815,6 +819,7 @@
   }
   Opts.AsyncThreadsCount = WorkerThreadsCount;
   Opts.FoldingRanges = FoldingRanges;
+  Opts.InlayHints = InlayHints;
   Opts.MemoryCleanup = getMemoryCleanupFunction();
 
   Opts.CodeComplete.IncludeIneligibleResults = IncludeIneligibleResults;
Index: clang-tools-extra/clangd/ClangdServer.h
===
--- clang-tools-extra/clangd/ClangdServer.h
+++ clang-tools-extra/clangd/ClangdServer.h
@@ -163,6 +163,9 @@
 /// Enable preview of FoldingRanges feature.
 bool FoldingRanges = false;
 
+/// Enable preview of InlayHints feature.
+bool InlayHints = false;
+
 FeatureModuleSet *FeatureModules = nullptr;
 
 explicit operator TUScheduler::Options() const;
Index: clang-tools-extra/clangd/ClangdLSPServer.cpp
===
--- clang-tools-extra/clangd/ClangdLSPServer.cpp
+++ clang-tools-extra/clangd/ClangdLSPServer.cpp
@@ -571,7 +571,6 @@
   {"referencesProvider", true},
   {"astProvider", true}, // clangd extension
   {"typeHierarchyProvider", true},
-  {"clangdInlayHintsProvider", true},
   {"memoryUsageProvider", true}, // clangd extension
   {"compilationDatabase",// clangd extension
llvm::json::Object{{"automaticReload", true}}},
@@ -608,6 +607,9 @@
   if (Opts.FoldingRanges)
 ServerCaps["foldingRangeProvider"] = true;
 
+  if (Opts.InlayHints)
+ServerCaps["clangdInlayHintsProvider"] = true;
+
   std::vector Commands;
   for (llvm::StringRef Command : Handlers.CommandHandlers.keys())
 Commands.push_back(Command);
@@ -1477,7 +1479,8 @@
   Bind.method("textDocument/documentLink", this, 
&ClangdLSPServer::onDocumentLink);
   Bind.method("textDocument/semanticTokens/full", this, 
&ClangdLSPServer::onSemanticTokens);
   Bind.method("textDocument/semanticTokens/full/delta", this, 
&ClangdLSPServer::onSemanticTokensDelta);
-  Bind.method("clangd/inlayHints", this, &ClangdLSPServer::onInlayHints);
+  if (Opts.InlayHints)
+Bind.method("clangd/inlayHints", this, &ClangdLSPServer::onInlayHints);
   Bind.method("$/memoryUsage", this, &ClangdLSPServer::onMemoryUsage);
   if (Opts.FoldingRanges)
 Bind.method("textDocument/foldingRange", this, 
&ClangdLSPServer::onFoldingRange);


Index: clang-tools-extra/clangd/tool/ClangdMain.cpp
===
--- clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -307,6 +307,10 @@
 Hidden,
 };
 
+opt InlayHints{"inlay-hints", cat(Features),
+ desc("Enable preview of InlayHints feature"), init(false),
+ Hidden};
+
 opt WorkerThreadsCount{
 "j",
 cat(Misc),
@@ -815,6 +819,7 @@
   }
   Opts.AsyncThreadsCount = WorkerThreadsCount;
   Opts.FoldingRanges = FoldingRanges;
+  Opts.InlayHints = InlayHints;
   Opts.MemoryCleanup = getMemoryCleanupFunction();
 
   Opts.CodeComplete.IncludeIneligibleResults = IncludeIneligibleResults;
Index: clang-tools-extra/clangd/ClangdServer.h
===
--- clang-tools-extra/clangd/ClangdServer.h
+++ clang-tools-extra/clangd/ClangdServer.h
@@ -163,6 +163,9 @@
 /// Enable preview of FoldingRanges feature.
 bool FoldingRanges = false;
 
+/// Enable preview of InlayHints feature.
+bool InlayHints = false;
+
 FeatureModuleSet *FeatureModules = nullptr;
 
 explicit operator TUScheduler::Options() const;
Index: clang-tools-extra/clangd/ClangdLSPServer.cpp
===
--- clang-tools-extra/clangd/ClangdLSPServer.cpp
+++ clang-tools-extra/clangd/ClangdLSPServer.cpp
@@ -571,7 +571,6 @@
   {"referencesProvider", true},
   {"astProvider", true}, // clangd extension
   {"typeHierarchyProvider", true},
-  {"clangdInlayHintsProvider", true},
   {"memoryUsageProvider", true}, // clangd extension
   {"compilationDa

[PATCH] D100821: [RISCV] Implement the vmmv.m/vmnot.m builtin.

2021-04-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen accepted this revision.
khchen added a comment.
This revision is now accepted and ready to land.

LGTM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100821/new/

https://reviews.llvm.org/D100821

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100824: [RISCV] Implement the vwcvt{u}.x.x.v/vncvt.x.x.w builtin.

2021-04-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen accepted this revision.
khchen added a comment.
This revision is now accepted and ready to land.

LGTM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100824/new/

https://reviews.llvm.org/D100824

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101143: [RISCV] [1/2] Add IR intrinsic for Zbe extension

2021-04-25 Thread Craig Topper via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG8cf54c7ff50c: [RISCV] [1/2] Add IR intrinsic for Zbe 
extension (authored by LevyHsu, committed by craig.topper).

Changed prior to commit:
  https://reviews.llvm.org/D101143?vs=340322&id=340414#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101143/new/

https://reviews.llvm.org/D101143

Files:
  clang/include/clang/Basic/BuiltinsRISCV.def
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbe.c
  clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbe.c
  llvm/include/llvm/IR/IntrinsicsRISCV.td
  llvm/lib/Target/RISCV/RISCVISelLowering.cpp
  llvm/lib/Target/RISCV/RISCVISelLowering.h
  llvm/lib/Target/RISCV/RISCVInstrInfoB.td
  llvm/test/CodeGen/RISCV/rv32zbe-intrinsic.ll
  llvm/test/CodeGen/RISCV/rv64zbe-intrinsic.ll

Index: llvm/test/CodeGen/RISCV/rv64zbe-intrinsic.ll
===
--- /dev/null
+++ llvm/test/CodeGen/RISCV/rv64zbe-intrinsic.ll
@@ -0,0 +1,69 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv64 -mattr=+experimental-b -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV64IB
+; RUN: llc -mtriple=riscv64 -mattr=+experimental-zbe -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV64IBE
+
+declare i32 @llvm.riscv.bcompress.i32(i32 %a, i32 %b)
+
+define signext i32 @bcompress32(i32 signext %a, i32 signext %b) nounwind {
+; RV64IB-LABEL: bcompress32:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bcompressw a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBE-LABEL: bcompress32:
+; RV64IBE:   # %bb.0:
+; RV64IBE-NEXT:bcompressw a0, a0, a1
+; RV64IBE-NEXT:ret
+  %tmp = call i32 @llvm.riscv.bcompress.i32(i32 %a, i32 %b)
+ ret i32 %tmp
+}
+
+declare i32 @llvm.riscv.bdecompress.i32(i32 %a, i32 %b)
+
+define signext i32 @bdecompress32(i32 signext %a, i32 signext %b) nounwind {
+; RV64IB-LABEL: bdecompress32:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bdecompressw a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBE-LABEL: bdecompress32:
+; RV64IBE:   # %bb.0:
+; RV64IBE-NEXT:bdecompressw a0, a0, a1
+; RV64IBE-NEXT:ret
+  %tmp = call i32 @llvm.riscv.bdecompress.i32(i32 %a, i32 %b)
+ ret i32 %tmp
+}
+
+declare i64 @llvm.riscv.bcompress.i64(i64 %a, i64 %b)
+
+define i64 @bcompress64(i64 %a, i64 %b) nounwind {
+; RV64IB-LABEL: bcompress64:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bcompress a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBE-LABEL: bcompress64:
+; RV64IBE:   # %bb.0:
+; RV64IBE-NEXT:bcompress a0, a0, a1
+; RV64IBE-NEXT:ret
+  %tmp = call i64 @llvm.riscv.bcompress.i64(i64 %a, i64 %b)
+ ret i64 %tmp
+}
+
+declare i64 @llvm.riscv.bdecompress.i64(i64 %a, i64 %b)
+
+define i64 @bdecompress64(i64 %a, i64 %b) nounwind {
+; RV64IB-LABEL: bdecompress64:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bdecompress a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBE-LABEL: bdecompress64:
+; RV64IBE:   # %bb.0:
+; RV64IBE-NEXT:bdecompress a0, a0, a1
+; RV64IBE-NEXT:ret
+  %tmp = call i64 @llvm.riscv.bdecompress.i64(i64 %a, i64 %b)
+ ret i64 %tmp
+}
Index: llvm/test/CodeGen/RISCV/rv32zbe-intrinsic.ll
===
--- /dev/null
+++ llvm/test/CodeGen/RISCV/rv32zbe-intrinsic.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv32 -mattr=+experimental-b -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV32IB
+; RUN: llc -mtriple=riscv32 -mattr=+experimental-zbe -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV32IBE
+
+declare i32 @llvm.riscv.bcompress.i32(i32 %a, i32 %b)
+
+define i32 @bcompress32(i32 %a, i32 %b) nounwind {
+; RV32IB-LABEL: bcompress32:
+; RV32IB:   # %bb.0:
+; RV32IB-NEXT:bcompress a0, a0, a1
+; RV32IB-NEXT:ret
+;
+; RV32IBE-LABEL: bcompress32:
+; RV32IBE:   # %bb.0:
+; RV32IBE-NEXT:bcompress a0, a0, a1
+; RV32IBE-NEXT:ret
+  %tmp = call i32 @llvm.riscv.bcompress.i32(i32 %a, i32 %b)
+ ret i32 %tmp
+}
+
+declare i32 @llvm.riscv.bdecompress.i32(i32 %a, i32 %b)
+
+define i32 @bdecompress32(i32 %a, i32 %b) nounwind {
+; RV32IB-LABEL: bdecompress32:
+; RV32IB:   # %bb.0:
+; RV32IB-NEXT:bdecompress a0, a0, a1
+; RV32IB-NEXT:ret
+;
+; RV32IBE-LABEL: bdecompress32:
+; RV32IBE:   # %bb.0:
+; RV32IBE-NEXT:bdecompress a0, a0, a1
+; RV32IBE-NEXT:ret
+  %tmp = call i32 @llvm.riscv.bdecompress.i32(i32 %a, i32 %b)
+ ret i32 %tmp
+}
Index: llvm/lib/Target/RISCV/RISCVInstrInfoB.td
===
--- llvm/lib/Target/RISCV/RISCVInstrInfoB.td
+++ llvm/lib/Target/RISCV/RISCVInstrInfoB.td
@@ -33,6 +33,10 @@
 def riscv_shflw  : SDNode<"RISCVISD::SH

[clang] 8cf54c7 - [RISCV] [1/2] Add IR intrinsic for Zbe extension

2021-04-25 Thread Craig Topper via cfe-commits

Author: Levy Hsu
Date: 2021-04-25T19:14:34-07:00
New Revision: 8cf54c7ff50cc4db79b2bc633e7d9d96509ef000

URL: 
https://github.com/llvm/llvm-project/commit/8cf54c7ff50cc4db79b2bc633e7d9d96509ef000
DIFF: 
https://github.com/llvm/llvm-project/commit/8cf54c7ff50cc4db79b2bc633e7d9d96509ef000.diff

LOG: [RISCV] [1/2] Add IR intrinsic for Zbe extension

RV32/64:
bcompress
bdecompress

RV64 ONLY:
bcompressw
bdecompressw

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D101143

Added: 
clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbe.c
clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbe.c
llvm/test/CodeGen/RISCV/rv32zbe-intrinsic.ll
llvm/test/CodeGen/RISCV/rv64zbe-intrinsic.ll

Modified: 
clang/include/clang/Basic/BuiltinsRISCV.def
clang/lib/CodeGen/CGBuiltin.cpp
llvm/include/llvm/IR/IntrinsicsRISCV.td
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVISelLowering.h
llvm/lib/Target/RISCV/RISCVInstrInfoB.td

Removed: 




diff  --git a/clang/include/clang/Basic/BuiltinsRISCV.def 
b/clang/include/clang/Basic/BuiltinsRISCV.def
index baf710a6071f..b2b4950f92bd 100644
--- a/clang/include/clang/Basic/BuiltinsRISCV.def
+++ b/clang/include/clang/Basic/BuiltinsRISCV.def
@@ -26,6 +26,15 @@ TARGET_BUILTIN(__builtin_riscv_clmul, "LiLiLi", "nc", 
"experimental-zbc")
 TARGET_BUILTIN(__builtin_riscv_clmulh, "LiLiLi", "nc", "experimental-zbc")
 TARGET_BUILTIN(__builtin_riscv_clmulr, "LiLiLi", "nc", "experimental-zbc")
 
+// Zbe extension
+TARGET_BUILTIN(__builtin_riscv_bcompress_32, "ZiZiZi", "nc", 
"experimental-zbe")
+TARGET_BUILTIN(__builtin_riscv_bcompress_64, "WiWiWi", "nc",
+   "experimental-zbe,64bit")
+TARGET_BUILTIN(__builtin_riscv_bdecompress_32, "ZiZiZi", "nc",
+   "experimental-zbe")
+TARGET_BUILTIN(__builtin_riscv_bdecompress_64, "WiWiWi", "nc",
+   "experimental-zbe,64bit")
+
 // Zbp extension
 TARGET_BUILTIN(__builtin_riscv_grev_32, "ZiZiZi", "nc", "experimental-zbp")
 TARGET_BUILTIN(__builtin_riscv_grev_64, "WiWiWi", "nc", 
"experimental-zbp,64bit")

diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 9a01691adcf1..9681a8ad5cd3 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -17844,6 +17844,10 @@ Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned 
BuiltinID,
   case RISCV::BI__builtin_riscv_clmul:
   case RISCV::BI__builtin_riscv_clmulh:
   case RISCV::BI__builtin_riscv_clmulr:
+  case RISCV::BI__builtin_riscv_bcompress_32:
+  case RISCV::BI__builtin_riscv_bcompress_64:
+  case RISCV::BI__builtin_riscv_bdecompress_32:
+  case RISCV::BI__builtin_riscv_bdecompress_64:
   case RISCV::BI__builtin_riscv_grev_32:
   case RISCV::BI__builtin_riscv_grev_64:
   case RISCV::BI__builtin_riscv_gorc_32:
@@ -17883,6 +17887,16 @@ Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned 
BuiltinID,
   ID = Intrinsic::riscv_clmulr;
   break;
 
+// Zbe
+case RISCV::BI__builtin_riscv_bcompress_32:
+case RISCV::BI__builtin_riscv_bcompress_64:
+  ID = Intrinsic::riscv_bcompress;
+  break;
+case RISCV::BI__builtin_riscv_bdecompress_32:
+case RISCV::BI__builtin_riscv_bdecompress_64:
+  ID = Intrinsic::riscv_bdecompress;
+  break;
+
 // Zbp
 case RISCV::BI__builtin_riscv_grev_32:
 case RISCV::BI__builtin_riscv_grev_64:

diff  --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbe.c 
b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbe.c
new file mode 100644
index ..eae3f6ff8b97
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbe.c
@@ -0,0 +1,33 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple riscv32 -target-feature +experimental-zbe 
-emit-llvm %s -o - \
+// RUN: | FileCheck %s  -check-prefix=RV32ZBE
+
+// RV32ZBE-LABEL: @bcompress(
+// RV32ZBE-NEXT:  entry:
+// RV32ZBE-NEXT:[[RS1_ADDR:%.*]] = alloca i32, align 4
+// RV32ZBE-NEXT:[[RS2_ADDR:%.*]] = alloca i32, align 4
+// RV32ZBE-NEXT:store i32 [[RS1:%.*]], i32* [[RS1_ADDR]], align 4
+// RV32ZBE-NEXT:store i32 [[RS2:%.*]], i32* [[RS2_ADDR]], align 4
+// RV32ZBE-NEXT:[[TMP0:%.*]] = load i32, i32* [[RS1_ADDR]], align 4
+// RV32ZBE-NEXT:[[TMP1:%.*]] = load i32, i32* [[RS2_ADDR]], align 4
+// RV32ZBE-NEXT:[[TMP2:%.*]] = call i32 @llvm.riscv.bcompress.i32(i32 
[[TMP0]], i32 [[TMP1]])
+// RV32ZBE-NEXT:ret i32 [[TMP2]]
+//
+long bcompress(long rs1, long rs2) {
+  return __builtin_riscv_bcompress_32(rs1, rs2);
+}
+
+// RV32ZBE-LABEL: @bdecompress(
+// RV32ZBE-NEXT:  entry:
+// RV32ZBE-NEXT:[[RS1_ADDR:%.*]] = alloca i32, align 4
+// RV32ZBE-NEXT:[[RS2_ADDR:%.*]] = alloca i32, align 4
+// RV32ZBE-NEXT:store i32 [[RS1:%.*]], i32* [[RS1_ADDR]], align 4
+// RV32ZBE-NEXT:store i32 [[RS2:%.*]], i32* [[RS2_ADDR]], align 4

[PATCH] D100739: [Coroutines] Handle overaligned frame allocation (2)

2021-04-25 Thread Yuanfang Chen via Phabricator via cfe-commits
ychen added inline comments.



Comment at: llvm/lib/Transforms/Coroutines/CoroFrame.cpp:854
+  // Save raw frame pointer to alloca
+  Value *Mem = Shape.CoroBegin->getMem();
+  AllocaInst *FramePtrAddr =

This seems to align with what this mem argument is designed for: 
https://reviews.llvm.org/D66230#1631860


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100739/new/

https://reviews.llvm.org/D100739

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101270: [clangd] Avoid including HeuristicResolver.h from ParsedAST.h

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge added a comment.

Motivation: ParsedAST.h is widely included, and now that ParsedAST stores 
HeuristicResolved by unique_ptr, the header dependency is no longer necessary.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101270/new/

https://reviews.llvm.org/D101270

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101270: [clangd] Avoid including HeuristicResolver.h from ParsedAST.h

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge created this revision.
nridge added a reviewer: sammccall.
Herald added subscribers: usaxena95, kadircet, arphaman.
nridge requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101270

Files:
  clang-tools-extra/clangd/ParsedAST.cpp
  clang-tools-extra/clangd/ParsedAST.h


Index: clang-tools-extra/clangd/ParsedAST.h
===
--- clang-tools-extra/clangd/ParsedAST.h
+++ clang-tools-extra/clangd/ParsedAST.h
@@ -24,7 +24,6 @@
 #include "Compiler.h"
 #include "Diagnostics.h"
 #include "Headers.h"
-#include "HeuristicResolver.h"
 #include "Preamble.h"
 #include "index/CanonicalIncludes.h"
 #include "support/Path.h"
@@ -43,6 +42,7 @@
 
 namespace clang {
 namespace clangd {
+class HeuristicResolver;
 class SymbolIndex;
 
 /// Stores and provides access to parsed AST.
Index: clang-tools-extra/clangd/ParsedAST.cpp
===
--- clang-tools-extra/clangd/ParsedAST.cpp
+++ clang-tools-extra/clangd/ParsedAST.cpp
@@ -15,6 +15,7 @@
 #include "Config.h"
 #include "Diagnostics.h"
 #include "Headers.h"
+#include "HeuristicResolver.h"
 #include "IncludeFixer.h"
 #include "Preamble.h"
 #include "SourceCode.h"


Index: clang-tools-extra/clangd/ParsedAST.h
===
--- clang-tools-extra/clangd/ParsedAST.h
+++ clang-tools-extra/clangd/ParsedAST.h
@@ -24,7 +24,6 @@
 #include "Compiler.h"
 #include "Diagnostics.h"
 #include "Headers.h"
-#include "HeuristicResolver.h"
 #include "Preamble.h"
 #include "index/CanonicalIncludes.h"
 #include "support/Path.h"
@@ -43,6 +42,7 @@
 
 namespace clang {
 namespace clangd {
+class HeuristicResolver;
 class SymbolIndex;
 
 /// Stores and provides access to parsed AST.
Index: clang-tools-extra/clangd/ParsedAST.cpp
===
--- clang-tools-extra/clangd/ParsedAST.cpp
+++ clang-tools-extra/clangd/ParsedAST.cpp
@@ -15,6 +15,7 @@
 #include "Config.h"
 #include "Diagnostics.h"
 #include "Headers.h"
+#include "HeuristicResolver.h"
 #include "IncludeFixer.h"
 #include "Preamble.h"
 #include "SourceCode.h"
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100741: [clangd] Rename HeuristicResolver::resolveCallExpr() to resolveReturnTypeOfCallExpr()

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc624e701491c: [clangd] Rename 
HeuristicResolver::resolveCallExpr() to resolveTypeOfCallExpr() (authored by 
nridge).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100741/new/

https://reviews.llvm.org/D100741

Files:
  clang-tools-extra/clangd/HeuristicResolver.cpp
  clang-tools-extra/clangd/HeuristicResolver.h


Index: clang-tools-extra/clangd/HeuristicResolver.h
===
--- clang-tools-extra/clangd/HeuristicResolver.h
+++ clang-tools-extra/clangd/HeuristicResolver.h
@@ -53,7 +53,8 @@
   resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const;
   std::vector
   resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) const;
-  std::vector resolveCallExpr(const CallExpr *CE) const;
+  std::vector
+  resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -115,7 +115,7 @@
 }
 
 std::vector
-HeuristicResolver::resolveCallExpr(const CallExpr *CE) const {
+HeuristicResolver::resolveTypeOfCallExpr(const CallExpr *CE) const {
   const auto *CalleeType = resolveExprToType(CE->getCallee());
   if (!CalleeType)
 return {};
@@ -171,7 +171,7 @@
 return resolveDeclsToType(resolveDeclRefExpr(RE));
   }
   if (const auto *CE = dyn_cast(E)) {
-return resolveDeclsToType(resolveCallExpr(CE));
+return resolveDeclsToType(resolveTypeOfCallExpr(CE));
   }
   if (const auto *ME = dyn_cast(E))
 return resolveDeclsToType({ME->getMemberDecl()});


Index: clang-tools-extra/clangd/HeuristicResolver.h
===
--- clang-tools-extra/clangd/HeuristicResolver.h
+++ clang-tools-extra/clangd/HeuristicResolver.h
@@ -53,7 +53,8 @@
   resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const;
   std::vector
   resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) const;
-  std::vector resolveCallExpr(const CallExpr *CE) const;
+  std::vector
+  resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -115,7 +115,7 @@
 }
 
 std::vector
-HeuristicResolver::resolveCallExpr(const CallExpr *CE) const {
+HeuristicResolver::resolveTypeOfCallExpr(const CallExpr *CE) const {
   const auto *CalleeType = resolveExprToType(CE->getCallee());
   if (!CalleeType)
 return {};
@@ -171,7 +171,7 @@
 return resolveDeclsToType(resolveDeclRefExpr(RE));
   }
   if (const auto *CE = dyn_cast(E)) {
-return resolveDeclsToType(resolveCallExpr(CE));
+return resolveDeclsToType(resolveTypeOfCallExpr(CE));
   }
   if (const auto *ME = dyn_cast(E))
 return resolveDeclsToType({ME->getMemberDecl()});
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100731: [clangd] Omit parameter hint for setter functions

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG6f6cf2da8d94: [clangd] Omit parameter hint for setter 
functions (authored by nridge).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100731/new/

https://reviews.llvm.org/D100731

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -336,6 +336,30 @@
ExpectedHint{"param: ", "param"});
 }
 
+TEST(ParameterHints, SetterFunctions) {
+  assertParameterHints(R"cpp(
+struct S {
+  void setParent(S* parent);
+  void set_parent(S* parent);
+  void setTimeout(int timeoutMillis);
+  void setTimeoutMillis(int timeout_millis);
+};
+void bar() {
+  S s;
+  // Parameter name matches setter name - omit hint.
+  s.setParent(nullptr);
+  // Support snake_case
+  s.set_parent(nullptr);
+  // Parameter name may contain extra info - show hint.
+  s.setTimeout($timeoutMillis[[120]]);
+  // FIXME: Ideally we'd want to omit this.
+  s.setTimeoutMillis($timeout_millis[[120]]);
+}
+  )cpp",
+   ExpectedHint{"timeoutMillis: ", "timeoutMillis"},
+   ExpectedHint{"timeout_millis: ", "timeout_millis"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -59,6 +59,8 @@
   // FIXME: Handle RecoveryExpr to try to hint some invalid calls.
 
 private:
+  using NameVec = SmallVector;
+
   // The purpose of Anchor is to deal with macros. It should be the call's
   // opening or closing parenthesis or brace. (Always using the opening would
   // make more sense but CallExpr only exposes the closing.) We heuristically
@@ -79,16 +81,17 @@
   if (Ctor->isCopyOrMoveConstructor())
 return;
 
-// FIXME: Exclude setters (i.e. functions with one argument whose name
-// begins with "set"), as their parameter name is also not likely to be
-// interesting.
-
 // Don't show hints for variadic parameters.
 size_t FixedParamCount = getFixedParamCount(Callee);
 size_t ArgCount = std::min(FixedParamCount, Args.size());
 
 NameVec ParameterNames = chooseParameterNames(Callee, ArgCount);
 
+// Exclude setters (i.e. functions with one argument whose name begins with
+// "set"), as their parameter name is also not likely to be interesting.
+if (isSetter(Callee, ParameterNames))
+  return;
+
 for (size_t I = 0; I < ArgCount; ++I) {
   StringRef Name = ParameterNames[I];
   if (!shouldHint(Args[I], Name))
@@ -99,6 +102,29 @@
 }
   }
 
+  static bool isSetter(const FunctionDecl *Callee, const NameVec &ParamNames) {
+if (ParamNames.size() != 1)
+  return false;
+
+StringRef Name = getSimpleName(*Callee);
+if (!Name.startswith_lower("set"))
+  return false;
+
+// In addition to checking that the function has one parameter and its
+// name starts with "set", also check that the part after "set" matches
+// the name of the parameter (ignoring case). The idea here is that if
+// the parameter name differs, it may contain extra information that
+// may be useful to show in a hint, as in:
+//   void setTimeout(int timeoutMillis);
+// This currently doesn't handle cases where params use snake_case
+// and functions don't, e.g.
+//   void setExceptionHandler(EHFunc exception_handler);
+// We could improve this by replacing `equals_lower` with some
+// `sloppy_equals` which ignores case and also skips underscores.
+StringRef WhatItIsSetting = Name.substr(3).ltrim("_");
+return WhatItIsSetting.equals_lower(ParamNames[0]);
+  }
+
   bool shouldHint(const Expr *Arg, StringRef ParamName) {
 if (ParamName.empty())
   return false;
@@ -155,8 +181,6 @@
 return {};
   }
 
-  using NameVec = SmallVector;
-
   NameVec chooseParameterNames(const FunctionDecl *Callee, size_t ArgCount) {
 // The current strategy here is to use all the parameter names from the
 // canonical declaration, unless they're all empty, in which case we
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100715: [clangd] Omit parameter hint if parameter name comment is present

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG753b247d71d7: [clangd] Omit parameter hint if parameter name 
comment is present (authored by nridge).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100715/new/

https://reviews.llvm.org/D100715

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -322,6 +322,20 @@
   )cpp");
 }
 
+TEST(ParameterHints, ParamNameComment) {
+  // Do not hint an argument which already has a comment
+  // with the parameter name preceding it.
+  assertParameterHints(R"cpp(
+void foo(int param);
+void bar() {
+  foo(/*param*/42);
+  foo( /* param = */ 42);
+  foo(/* the answer */$param[[42]]);
+}
+  )cpp",
+   ExpectedHint{"param: ", "param"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -19,7 +19,13 @@
 class InlayHintVisitor : public RecursiveASTVisitor {
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
-  : Results(Results), AST(AST.getASTContext()) {}
+  : Results(Results), AST(AST.getASTContext()),
+MainFileID(AST.getSourceManager().getMainFileID()) {
+bool Invalid = false;
+llvm::StringRef Buf =
+AST.getSourceManager().getBufferData(MainFileID, &Invalid);
+MainFileBuf = Invalid ? StringRef{} : Buf;
+  }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
 // Weed out constructor calls that don't look like a function call with
@@ -102,11 +108,37 @@
 if (ParamName == getSpelledIdentifier(Arg))
   return false;
 
-// FIXME: Exclude argument expressions preceded by a /*paramName=*/ 
comment.
+// Exclude argument expressions preceded by a /*paramName*/.
+if (isPrecededByParamNameComment(Arg, ParamName))
+  return false;
 
 return true;
   }
 
+  // Checks if "E" is spelled in the main file and preceded by a C-style 
comment
+  // whose contents match ParamName (allowing for whitespace and an optional 
"="
+  // at the end.
+  bool isPrecededByParamNameComment(const Expr *E, StringRef ParamName) {
+auto &SM = AST.getSourceManager();
+auto ExprStartLoc = SM.getTopMacroCallerLoc(E->getBeginLoc());
+auto Decomposed = SM.getDecomposedLoc(ExprStartLoc);
+if (Decomposed.first != MainFileID)
+  return false;
+
+StringRef SourcePrefix = MainFileBuf.substr(0, Decomposed.second);
+// Allow whitespace between comment and expression.
+SourcePrefix = SourcePrefix.rtrim();
+// Check for comment ending.
+if (!SourcePrefix.consume_back("*/"))
+  return false;
+// Allow whitespace and "=" at end of comment.
+SourcePrefix = SourcePrefix.rtrim().rtrim('=').rtrim();
+// Other than that, the comment must contain exactly ParamName.
+if (!SourcePrefix.consume_back(ParamName))
+  return false;
+return SourcePrefix.rtrim().endswith("/*");
+  }
+
   // If "E" spells a single unqualified identifier, return that name.
   // Otherwise, return an empty string.
   static StringRef getSpelledIdentifier(const Expr *E) {
@@ -208,6 +240,8 @@
 
   std::vector &Results;
   ASTContext &AST;
+  FileID MainFileID;
+  StringRef MainFileBuf;
 };
 
 std::vector inlayHints(ParsedAST &AST) {


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -322,6 +322,20 @@
   )cpp");
 }
 
+TEST(ParameterHints, ParamNameComment) {
+  // Do not hint an argument which already has a comment
+  // with the parameter name preceding it.
+  assertParameterHints(R"cpp(
+void foo(int param);
+void bar() {
+  foo(/*param*/42);
+  foo( /* param = */ 42);
+  foo(/* the answer */$param[[42]]);
+}
+  )cpp",
+   ExpectedHint{"param: ", "param"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -19,7 +19,13 @@
 class InlayHintVisitor : public RecursiveASTVisitor {
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
-  : Results(Results), AST(AST.getASTContext()) {}
+  : Results(Results), AST(AST.getASTContext()

[clang-tools-extra] c624e70 - [clangd] Rename HeuristicResolver::resolveCallExpr() to resolveTypeOfCallExpr()

2021-04-25 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-04-25T19:20:14-04:00
New Revision: c624e701491c320cf5c662006082a8e956c30e8d

URL: 
https://github.com/llvm/llvm-project/commit/c624e701491c320cf5c662006082a8e956c30e8d
DIFF: 
https://github.com/llvm/llvm-project/commit/c624e701491c320cf5c662006082a8e956c30e8d.diff

LOG: [clangd] Rename HeuristicResolver::resolveCallExpr() to 
resolveTypeOfCallExpr()

Differential Revision: https://reviews.llvm.org/D100741

Added: 


Modified: 
clang-tools-extra/clangd/HeuristicResolver.cpp
clang-tools-extra/clangd/HeuristicResolver.h

Removed: 




diff  --git a/clang-tools-extra/clangd/HeuristicResolver.cpp 
b/clang-tools-extra/clangd/HeuristicResolver.cpp
index 27ff0c7ea7cf..aacc90369fec 100644
--- a/clang-tools-extra/clangd/HeuristicResolver.cpp
+++ b/clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -115,7 +115,7 @@ std::vector 
HeuristicResolver::resolveDeclRefExpr(
 }
 
 std::vector
-HeuristicResolver::resolveCallExpr(const CallExpr *CE) const {
+HeuristicResolver::resolveTypeOfCallExpr(const CallExpr *CE) const {
   const auto *CalleeType = resolveExprToType(CE->getCallee());
   if (!CalleeType)
 return {};
@@ -171,7 +171,7 @@ const Type *HeuristicResolver::resolveExprToType(const Expr 
*E) const {
 return resolveDeclsToType(resolveDeclRefExpr(RE));
   }
   if (const auto *CE = dyn_cast(E)) {
-return resolveDeclsToType(resolveCallExpr(CE));
+return resolveDeclsToType(resolveTypeOfCallExpr(CE));
   }
   if (const auto *ME = dyn_cast(E))
 return resolveDeclsToType({ME->getMemberDecl()});

diff  --git a/clang-tools-extra/clangd/HeuristicResolver.h 
b/clang-tools-extra/clangd/HeuristicResolver.h
index 30f8eb16bd58..dd906245da52 100644
--- a/clang-tools-extra/clangd/HeuristicResolver.h
+++ b/clang-tools-extra/clangd/HeuristicResolver.h
@@ -53,7 +53,8 @@ class HeuristicResolver {
   resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const;
   std::vector
   resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) const;
-  std::vector resolveCallExpr(const CallExpr *CE) const;
+  std::vector
+  resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] 6f6cf2d - [clangd] Omit parameter hint for setter functions

2021-04-25 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-04-25T19:20:12-04:00
New Revision: 6f6cf2da8d9453f2bd57978be1e5d0765ea50a36

URL: 
https://github.com/llvm/llvm-project/commit/6f6cf2da8d9453f2bd57978be1e5d0765ea50a36
DIFF: 
https://github.com/llvm/llvm-project/commit/6f6cf2da8d9453f2bd57978be1e5d0765ea50a36.diff

LOG: [clangd] Omit parameter hint for setter functions

Differential Revision: https://reviews.llvm.org/D100731

Added: 


Modified: 
clang-tools-extra/clangd/InlayHints.cpp
clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/InlayHints.cpp 
b/clang-tools-extra/clangd/InlayHints.cpp
index 948a9e511e7f..a9f3100a187e 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -59,6 +59,8 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
   // FIXME: Handle RecoveryExpr to try to hint some invalid calls.
 
 private:
+  using NameVec = SmallVector;
+
   // The purpose of Anchor is to deal with macros. It should be the call's
   // opening or closing parenthesis or brace. (Always using the opening would
   // make more sense but CallExpr only exposes the closing.) We heuristically
@@ -79,16 +81,17 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
   if (Ctor->isCopyOrMoveConstructor())
 return;
 
-// FIXME: Exclude setters (i.e. functions with one argument whose name
-// begins with "set"), as their parameter name is also not likely to be
-// interesting.
-
 // Don't show hints for variadic parameters.
 size_t FixedParamCount = getFixedParamCount(Callee);
 size_t ArgCount = std::min(FixedParamCount, Args.size());
 
 NameVec ParameterNames = chooseParameterNames(Callee, ArgCount);
 
+// Exclude setters (i.e. functions with one argument whose name begins with
+// "set"), as their parameter name is also not likely to be interesting.
+if (isSetter(Callee, ParameterNames))
+  return;
+
 for (size_t I = 0; I < ArgCount; ++I) {
   StringRef Name = ParameterNames[I];
   if (!shouldHint(Args[I], Name))
@@ -99,6 +102,29 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 }
   }
 
+  static bool isSetter(const FunctionDecl *Callee, const NameVec &ParamNames) {
+if (ParamNames.size() != 1)
+  return false;
+
+StringRef Name = getSimpleName(*Callee);
+if (!Name.startswith_lower("set"))
+  return false;
+
+// In addition to checking that the function has one parameter and its
+// name starts with "set", also check that the part after "set" matches
+// the name of the parameter (ignoring case). The idea here is that if
+// the parameter name 
diff ers, it may contain extra information that
+// may be useful to show in a hint, as in:
+//   void setTimeout(int timeoutMillis);
+// This currently doesn't handle cases where params use snake_case
+// and functions don't, e.g.
+//   void setExceptionHandler(EHFunc exception_handler);
+// We could improve this by replacing `equals_lower` with some
+// `sloppy_equals` which ignores case and also skips underscores.
+StringRef WhatItIsSetting = Name.substr(3).ltrim("_");
+return WhatItIsSetting.equals_lower(ParamNames[0]);
+  }
+
   bool shouldHint(const Expr *Arg, StringRef ParamName) {
 if (ParamName.empty())
   return false;
@@ -155,8 +181,6 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 return {};
   }
 
-  using NameVec = SmallVector;
-
   NameVec chooseParameterNames(const FunctionDecl *Callee, size_t ArgCount) {
 // The current strategy here is to use all the parameter names from the
 // canonical declaration, unless they're all empty, in which case we

diff  --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp 
b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index 086c502181ef..23f0e9ef11d3 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -336,6 +336,30 @@ TEST(ParameterHints, ParamNameComment) {
ExpectedHint{"param: ", "param"});
 }
 
+TEST(ParameterHints, SetterFunctions) {
+  assertParameterHints(R"cpp(
+struct S {
+  void setParent(S* parent);
+  void set_parent(S* parent);
+  void setTimeout(int timeoutMillis);
+  void setTimeoutMillis(int timeout_millis);
+};
+void bar() {
+  S s;
+  // Parameter name matches setter name - omit hint.
+  s.setParent(nullptr);
+  // Support snake_case
+  s.set_parent(nullptr);
+  // Parameter name may contain extra info - show hint.
+  s.setTimeout($timeoutMillis[[120]]);
+  // FIXME: Ideally we'd want to omit this.
+  s.setTimeoutMillis($timeout_millis[[120]]);
+}
+  )cpp",
+   ExpectedHint{"timeoutMillis: ", "timeoutMillis"},
+   Expec

[clang-tools-extra] 753b247 - [clangd] Omit parameter hint if parameter name comment is present

2021-04-25 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-04-25T19:20:10-04:00
New Revision: 753b247d71d7e74dd6998735848a2d9e0b6317de

URL: 
https://github.com/llvm/llvm-project/commit/753b247d71d7e74dd6998735848a2d9e0b6317de
DIFF: 
https://github.com/llvm/llvm-project/commit/753b247d71d7e74dd6998735848a2d9e0b6317de.diff

LOG: [clangd] Omit parameter hint if parameter name comment is present

Differential Revision: https://reviews.llvm.org/D100715

Added: 


Modified: 
clang-tools-extra/clangd/InlayHints.cpp
clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/InlayHints.cpp 
b/clang-tools-extra/clangd/InlayHints.cpp
index 54b109443b30..948a9e511e7f 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -19,7 +19,13 @@ namespace clangd {
 class InlayHintVisitor : public RecursiveASTVisitor {
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
-  : Results(Results), AST(AST.getASTContext()) {}
+  : Results(Results), AST(AST.getASTContext()),
+MainFileID(AST.getSourceManager().getMainFileID()) {
+bool Invalid = false;
+llvm::StringRef Buf =
+AST.getSourceManager().getBufferData(MainFileID, &Invalid);
+MainFileBuf = Invalid ? StringRef{} : Buf;
+  }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
 // Weed out constructor calls that don't look like a function call with
@@ -102,11 +108,37 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 if (ParamName == getSpelledIdentifier(Arg))
   return false;
 
-// FIXME: Exclude argument expressions preceded by a /*paramName=*/ 
comment.
+// Exclude argument expressions preceded by a /*paramName*/.
+if (isPrecededByParamNameComment(Arg, ParamName))
+  return false;
 
 return true;
   }
 
+  // Checks if "E" is spelled in the main file and preceded by a C-style 
comment
+  // whose contents match ParamName (allowing for whitespace and an optional 
"="
+  // at the end.
+  bool isPrecededByParamNameComment(const Expr *E, StringRef ParamName) {
+auto &SM = AST.getSourceManager();
+auto ExprStartLoc = SM.getTopMacroCallerLoc(E->getBeginLoc());
+auto Decomposed = SM.getDecomposedLoc(ExprStartLoc);
+if (Decomposed.first != MainFileID)
+  return false;
+
+StringRef SourcePrefix = MainFileBuf.substr(0, Decomposed.second);
+// Allow whitespace between comment and expression.
+SourcePrefix = SourcePrefix.rtrim();
+// Check for comment ending.
+if (!SourcePrefix.consume_back("*/"))
+  return false;
+// Allow whitespace and "=" at end of comment.
+SourcePrefix = SourcePrefix.rtrim().rtrim('=').rtrim();
+// Other than that, the comment must contain exactly ParamName.
+if (!SourcePrefix.consume_back(ParamName))
+  return false;
+return SourcePrefix.rtrim().endswith("/*");
+  }
+
   // If "E" spells a single unqualified identifier, return that name.
   // Otherwise, return an empty string.
   static StringRef getSpelledIdentifier(const Expr *E) {
@@ -208,6 +240,8 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 
   std::vector &Results;
   ASTContext &AST;
+  FileID MainFileID;
+  StringRef MainFileBuf;
 };
 
 std::vector inlayHints(ParsedAST &AST) {

diff  --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp 
b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index 6a39dc9d923a..086c502181ef 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -322,6 +322,20 @@ TEST(ParameterHints, UserDefinedLiteral) {
   )cpp");
 }
 
+TEST(ParameterHints, ParamNameComment) {
+  // Do not hint an argument which already has a comment
+  // with the parameter name preceding it.
+  assertParameterHints(R"cpp(
+void foo(int param);
+void bar() {
+  foo(/*param*/42);
+  foo( /* param = */ 42);
+  foo(/* the answer */$param[[42]]);
+}
+  )cpp",
+   ExpectedHint{"param: ", "param"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100741: [clangd] Rename HeuristicResolver::resolveCallExpr() to resolveReturnTypeOfCallExpr()

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340393.
nridge marked an inline comment as done.
nridge added a comment.

Address review comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100741/new/

https://reviews.llvm.org/D100741

Files:
  clang-tools-extra/clangd/HeuristicResolver.cpp
  clang-tools-extra/clangd/HeuristicResolver.h


Index: clang-tools-extra/clangd/HeuristicResolver.h
===
--- clang-tools-extra/clangd/HeuristicResolver.h
+++ clang-tools-extra/clangd/HeuristicResolver.h
@@ -53,7 +53,8 @@
   resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const;
   std::vector
   resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) const;
-  std::vector resolveCallExpr(const CallExpr *CE) const;
+  std::vector
+  resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -115,7 +115,7 @@
 }
 
 std::vector
-HeuristicResolver::resolveCallExpr(const CallExpr *CE) const {
+HeuristicResolver::resolveTypeOfCallExpr(const CallExpr *CE) const {
   const auto *CalleeType = resolveExprToType(CE->getCallee());
   if (!CalleeType)
 return {};
@@ -171,7 +171,7 @@
 return resolveDeclsToType(resolveDeclRefExpr(RE));
   }
   if (const auto *CE = dyn_cast(E)) {
-return resolveDeclsToType(resolveCallExpr(CE));
+return resolveDeclsToType(resolveTypeOfCallExpr(CE));
   }
   if (const auto *ME = dyn_cast(E))
 return resolveDeclsToType({ME->getMemberDecl()});


Index: clang-tools-extra/clangd/HeuristicResolver.h
===
--- clang-tools-extra/clangd/HeuristicResolver.h
+++ clang-tools-extra/clangd/HeuristicResolver.h
@@ -53,7 +53,8 @@
   resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const;
   std::vector
   resolveDeclRefExpr(const DependentScopeDeclRefExpr *RE) const;
-  std::vector resolveCallExpr(const CallExpr *CE) const;
+  std::vector
+  resolveTypeOfCallExpr(const CallExpr *CE) const;
   std::vector
   resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD) const;
   std::vector
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -115,7 +115,7 @@
 }
 
 std::vector
-HeuristicResolver::resolveCallExpr(const CallExpr *CE) const {
+HeuristicResolver::resolveTypeOfCallExpr(const CallExpr *CE) const {
   const auto *CalleeType = resolveExprToType(CE->getCallee());
   if (!CalleeType)
 return {};
@@ -171,7 +171,7 @@
 return resolveDeclsToType(resolveDeclRefExpr(RE));
   }
   if (const auto *CE = dyn_cast(E)) {
-return resolveDeclsToType(resolveCallExpr(CE));
+return resolveDeclsToType(resolveTypeOfCallExpr(CE));
   }
   if (const auto *ME = dyn_cast(E))
 return resolveDeclsToType({ME->getMemberDecl()});
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100731: [clangd] Omit parameter hint for setter functions

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340392.
nridge marked 2 inline comments as done.
nridge added a comment.

Address review comments


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100731/new/

https://reviews.llvm.org/D100731

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -336,6 +336,30 @@
ExpectedHint{"param: ", "param"});
 }
 
+TEST(ParameterHints, SetterFunctions) {
+  assertParameterHints(R"cpp(
+struct S {
+  void setParent(S* parent);
+  void set_parent(S* parent);
+  void setTimeout(int timeoutMillis);
+  void setTimeoutMillis(int timeout_millis);
+};
+void bar() {
+  S s;
+  // Parameter name matches setter name - omit hint.
+  s.setParent(nullptr);
+  // Support snake_case
+  s.set_parent(nullptr);
+  // Parameter name may contain extra info - show hint.
+  s.setTimeout($timeoutMillis[[120]]);
+  // FIXME: Ideally we'd want to omit this.
+  s.setTimeoutMillis($timeout_millis[[120]]);
+}
+  )cpp",
+   ExpectedHint{"timeoutMillis: ", "timeoutMillis"},
+   ExpectedHint{"timeout_millis: ", "timeout_millis"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -59,6 +59,8 @@
   // FIXME: Handle RecoveryExpr to try to hint some invalid calls.
 
 private:
+  using NameVec = SmallVector;
+
   // The purpose of Anchor is to deal with macros. It should be the call's
   // opening or closing parenthesis or brace. (Always using the opening would
   // make more sense but CallExpr only exposes the closing.) We heuristically
@@ -79,16 +81,17 @@
   if (Ctor->isCopyOrMoveConstructor())
 return;
 
-// FIXME: Exclude setters (i.e. functions with one argument whose name
-// begins with "set"), as their parameter name is also not likely to be
-// interesting.
-
 // Don't show hints for variadic parameters.
 size_t FixedParamCount = getFixedParamCount(Callee);
 size_t ArgCount = std::min(FixedParamCount, Args.size());
 
 NameVec ParameterNames = chooseParameterNames(Callee, ArgCount);
 
+// Exclude setters (i.e. functions with one argument whose name begins with
+// "set"), as their parameter name is also not likely to be interesting.
+if (isSetter(Callee, ParameterNames))
+  return;
+
 for (size_t I = 0; I < ArgCount; ++I) {
   StringRef Name = ParameterNames[I];
   if (!shouldHint(Args[I], Name))
@@ -99,6 +102,29 @@
 }
   }
 
+  static bool isSetter(const FunctionDecl *Callee, const NameVec &ParamNames) {
+if (ParamNames.size() != 1)
+  return false;
+
+StringRef Name = getSimpleName(*Callee);
+if (!Name.startswith_lower("set"))
+  return false;
+
+// In addition to checking that the function has one parameter and its
+// name starts with "set", also check that the part after "set" matches
+// the name of the parameter (ignoring case). The idea here is that if
+// the parameter name differs, it may contain extra information that
+// may be useful to show in a hint, as in:
+//   void setTimeout(int timeoutMillis);
+// This currently doesn't handle cases where params use snake_case
+// and functions don't, e.g.
+//   void setExceptionHandler(EHFunc exception_handler);
+// We could improve this by replacing `equals_lower` with some
+// `sloppy_equals` which ignores case and also skips underscores.
+StringRef WhatItIsSetting = Name.substr(3).ltrim("_");
+return WhatItIsSetting.equals_lower(ParamNames[0]);
+  }
+
   bool shouldHint(const Expr *Arg, StringRef ParamName) {
 if (ParamName.empty())
   return false;
@@ -155,8 +181,6 @@
 return {};
   }
 
-  using NameVec = SmallVector;
-
   NameVec chooseParameterNames(const FunctionDecl *Callee, size_t ArgCount) {
 // The current strategy here is to use all the parameter names from the
 // canonical declaration, unless they're all empty, in which case we
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100715: [clangd] Omit parameter hint if parameter name comment is present

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340391.
nridge marked 3 inline comments as done.
nridge added a comment.

Address review comments


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100715/new/

https://reviews.llvm.org/D100715

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -322,6 +322,20 @@
   )cpp");
 }
 
+TEST(ParameterHints, ParamNameComment) {
+  // Do not hint an argument which already has a comment
+  // with the parameter name preceding it.
+  assertParameterHints(R"cpp(
+void foo(int param);
+void bar() {
+  foo(/*param*/42);
+  foo( /* param = */ 42);
+  foo(/* the answer */$param[[42]]);
+}
+  )cpp",
+   ExpectedHint{"param: ", "param"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -19,7 +19,13 @@
 class InlayHintVisitor : public RecursiveASTVisitor {
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
-  : Results(Results), AST(AST.getASTContext()) {}
+  : Results(Results), AST(AST.getASTContext()),
+MainFileID(AST.getSourceManager().getMainFileID()) {
+bool Invalid = false;
+llvm::StringRef Buf =
+AST.getSourceManager().getBufferData(MainFileID, &Invalid);
+MainFileBuf = Invalid ? StringRef{} : Buf;
+  }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
 // Weed out constructor calls that don't look like a function call with
@@ -102,11 +108,37 @@
 if (ParamName == getSpelledIdentifier(Arg))
   return false;
 
-// FIXME: Exclude argument expressions preceded by a /*paramName=*/ 
comment.
+// Exclude argument expressions preceded by a /*paramName*/.
+if (isPrecededByParamNameComment(Arg, ParamName))
+  return false;
 
 return true;
   }
 
+  // Checks if "E" is spelled in the main file and preceded by a C-style 
comment
+  // whose contents match ParamName (allowing for whitespace and an optional 
"="
+  // at the end.
+  bool isPrecededByParamNameComment(const Expr *E, StringRef ParamName) {
+auto &SM = AST.getSourceManager();
+auto ExprStartLoc = SM.getTopMacroCallerLoc(E->getBeginLoc());
+auto Decomposed = SM.getDecomposedLoc(ExprStartLoc);
+if (Decomposed.first != MainFileID)
+  return false;
+
+StringRef SourcePrefix = MainFileBuf.substr(0, Decomposed.second);
+// Allow whitespace between comment and expression.
+SourcePrefix = SourcePrefix.rtrim();
+// Check for comment ending.
+if (!SourcePrefix.consume_back("*/"))
+  return false;
+// Allow whitespace and "=" at end of comment.
+SourcePrefix = SourcePrefix.rtrim().rtrim('=').rtrim();
+// Other than that, the comment must contain exactly ParamName.
+if (!SourcePrefix.consume_back(ParamName))
+  return false;
+return SourcePrefix.rtrim().endswith("/*");
+  }
+
   // If "E" spells a single unqualified identifier, return that name.
   // Otherwise, return an empty string.
   static StringRef getSpelledIdentifier(const Expr *E) {
@@ -208,6 +240,8 @@
 
   std::vector &Results;
   ASTContext &AST;
+  FileID MainFileID;
+  StringRef MainFileBuf;
 };
 
 std::vector inlayHints(ParsedAST &AST) {


Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -322,6 +322,20 @@
   )cpp");
 }
 
+TEST(ParameterHints, ParamNameComment) {
+  // Do not hint an argument which already has a comment
+  // with the parameter name preceding it.
+  assertParameterHints(R"cpp(
+void foo(int param);
+void bar() {
+  foo(/*param*/42);
+  foo( /* param = */ 42);
+  foo(/* the answer */$param[[42]]);
+}
+  )cpp",
+   ExpectedHint{"param: ", "param"});
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -19,7 +19,13 @@
 class InlayHintVisitor : public RecursiveASTVisitor {
 public:
   InlayHintVisitor(std::vector &Results, ParsedAST &AST)
-  : Results(Results), AST(AST.getASTContext()) {}
+  : Results(Results), AST(AST.getASTContext()),
+MainFileID(AST.getSourceManager().getMainFileID()) {
+bool Invalid = false;
+llvm::StringRef Buf

[PATCH] D99056: [clangd] Use HeuristicResolver to produce a better semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd941863de2be: [clangd] Use HeuristicResolver to produce a 
better semantic token for name… (authored by nridge).

Changed prior to commit:
  https://reviews.llvm.org/D99056?vs=340382&id=340385#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99056/new/

https://reviews.llvm.org/D99056

Files:
  clang-tools-extra/clangd/SemanticHighlighting.cpp
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -695,10 +695,10 @@
 };
 template 
 struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
-  using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+  using $Class[[Base]]<$TemplateParameter[[T]]>::$Field_dependentName[[member]];
 
   void $Method_decl[[method]]() {
-(void)$Unknown_dependentName[[member]];
+(void)$Field_dependentName[[member]];
   }
 };
   )cpp",
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -64,8 +64,10 @@
   llvm_unreachable("invalid name kind");
 }
 
-llvm::Optional kindForType(const Type *TP);
-llvm::Optional kindForDecl(const NamedDecl *D) {
+llvm::Optional kindForType(const Type *TP,
+ const HeuristicResolver *Resolver);
+llvm::Optional
+kindForDecl(const NamedDecl *D, const HeuristicResolver *Resolver) {
   if (auto *USD = dyn_cast(D)) {
 if (auto *Target = USD->getTargetDecl())
   D = Target;
@@ -76,7 +78,8 @@
   }
   if (auto *TD = dyn_cast(D)) {
 // We try to highlight typedefs as their underlying type.
-if (auto K = kindForType(TD->getUnderlyingType().getTypePtrOrNull()))
+if (auto K =
+kindForType(TD->getUnderlyingType().getTypePtrOrNull(), Resolver))
   return K;
 // And fallback to a generic kind if this fails.
 return HighlightingKind::Typedef;
@@ -133,23 +136,27 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
-  if (isa(D)) {
-// FIXME: We may be able to do better using HeuristicResolver.
+  if (const auto *UUVD = dyn_cast(D)) {
+auto Targets = Resolver->resolveUsingValueDecl(UUVD);
+if (!Targets.empty()) {
+  return kindForDecl(Targets[0], Resolver);
+}
 return HighlightingKind::Unknown;
   }
   return llvm::None;
 }
-llvm::Optional kindForType(const Type *TP) {
+llvm::Optional
+kindForType(const Type *TP, const HeuristicResolver *Resolver) {
   if (!TP)
 return llvm::None;
   if (TP->isBuiltinType()) // Builtins are special, they do not have decls.
 return HighlightingKind::Primitive;
   if (auto *TD = dyn_cast(TP))
-return kindForDecl(TD->getDecl());
+return kindForDecl(TD->getDecl(), Resolver);
   if (isa(TP))
 return HighlightingKind::Class;
   if (auto *TD = TP->getAsTagDecl())
-return kindForDecl(TD);
+return kindForDecl(TD, Resolver);
   return llvm::None;
 }
 
@@ -400,11 +407,14 @@
 return WithInactiveLines;
   }
 
+  const HeuristicResolver *getResolver() const { return Resolver; }
+
 private:
   const syntax::TokenBuffer &TB;
   const SourceManager &SourceMgr;
   const LangOptions &LangOpts;
   std::vector Tokens;
+  const HeuristicResolver *Resolver;
   // returned from addToken(InvalidLoc)
   HighlightingToken InvalidHighlightingToken;
 };
@@ -457,7 +467,7 @@
   CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {}
 
   bool VisitDecltypeTypeLoc(DecltypeTypeLoc L) {
-if (auto K = kindForType(L.getTypePtr())) {
+if (auto K = kindForType(L.getTypePtr(), H.getResolver())) {
   auto &Tok = H.addToken(L.getBeginLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(L.getTypePtr()))
@@ -470,7 +480,8 @@
 auto *AT = D->getType()->getContainedAutoType();
 if (!AT)
   return true;
-if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull())) {
+if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(),
+ H.getResolver())) {
   auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(AT->getDeducedType().getTypePtrOrNull()))
@@ -611,7 +622,7 @@
 for (const NamedDecl *Decl : R.Targets) {
   if (!canHighlightName(Decl->getDe

[PATCH] D99052: [clangd] Produce semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGddfe13e757cb: [clangd] Produce semantic token for name 
referring to UnresolvedUsingValueDecl (authored by nridge).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99052/new/

https://reviews.llvm.org/D99052

Files:
  clang-tools-extra/clangd/SemanticHighlighting.cpp
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@
 @implementation $Class[[Foo]]($Namespace_decl[[Bar]])
 @end
   )cpp",
+  // Member imported from dependent base
+  R"cpp(
+template  struct $Class_decl[[Base]] {
+  int $Field_decl[[member]];
+};
+template 
+struct $Class_decl[[Derived]] : 
$Class[[Base]]<$TemplateParameter[[T]]> {
+  using 
$Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+  void $Method_decl[[method]]() {
+(void)$Unknown_dependentName[[member]];
+  }
+};
+  )cpp",
   };
   for (const auto &TestCase : TestCases)
 // Mask off scope modifiers to keep the tests manageable.
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
+  if (isa(D)) {
+// FIXME: We may be able to do better using HeuristicResolver.
+return HighlightingKind::Unknown;
+  }
   return llvm::None;
 }
 llvm::Optional kindForType(const Type *TP) {
@@ -228,6 +232,12 @@
   return false;
 }
 
+bool isDependent(const Decl *D) {
+  if (isa(D))
+return true;
+  return false;
+}
+
 // For a macro usage `DUMP(foo)`, we want:
 //  - DUMP --> "macro"
 //  - foo --> "variable".
@@ -619,9 +629,14 @@
 Tok.addModifier(HighlightingModifier::Static);
   if (isAbstract(Decl))
 Tok.addModifier(HighlightingModifier::Abstract);
+  if (isDependent(Decl))
+Tok.addModifier(HighlightingModifier::DependentName);
   if (Decl->isDeprecated())
 Tok.addModifier(HighlightingModifier::Deprecated);
-  if (R.IsDecl)
+  // Do not treat an UnresolvedUsingValueDecl as a declaration.
+  // It's more common to think of it as a reference to the
+  // underlying declaration.
+  if (R.IsDecl && !isa(Decl))
 Tok.addModifier(HighlightingModifier::Declaration);
 }
   },


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@
 @implementation $Class[[Foo]]($Namespace_decl[[Bar]])
 @end
   )cpp",
+  // Member imported from dependent base
+  R"cpp(
+template  struct $Class_decl[[Base]] {
+  int $Field_decl[[member]];
+};
+template 
+struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
+  using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+  void $Method_decl[[method]]() {
+(void)$Unknown_dependentName[[member]];
+  }
+};
+  )cpp",
   };
   for (const auto &TestCase : TestCases)
 // Mask off scope modifiers to keep the tests manageable.
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
+  if (isa(D)) {
+// FIXME: We may be able to do better using HeuristicResolver.
+return HighlightingKind::Unknown;
+  }
   return llvm::None;
 }
 llvm::Optional kindForType(const Type *TP) {
@@ -228,6 +232,12 @@
   return false;
 }
 
+bool isDependent(const Decl *D) {
+  if (isa(D))
+return true;
+  return false;
+}
+
 // For a macro usage `DUMP(foo)`, we want:
 //  - DUMP --> "macro"
 //  - foo --> "variable".
@@ -619,9 +629,14 @@
 Tok.addModifier(HighlightingModifier::Static);
   if (isAbstract(Decl))
 Tok.addModifier(HighlightingModifier::Abstract);
+  if (isDependent(Dec

[clang-tools-extra] d941863 - [clangd] Use HeuristicResolver to produce a better semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-04-25T16:45:04-04:00
New Revision: d941863de2becb3d8d2e00676fc7125974934c7f

URL: 
https://github.com/llvm/llvm-project/commit/d941863de2becb3d8d2e00676fc7125974934c7f
DIFF: 
https://github.com/llvm/llvm-project/commit/d941863de2becb3d8d2e00676fc7125974934c7f.diff

LOG: [clangd] Use HeuristicResolver to produce a better semantic token for name 
referring to UnresolvedUsingValueDecl

Fixes https://github.com/clangd/clangd/issues/686

Differential Revision: https://reviews.llvm.org/D99056

Added: 


Modified: 
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp 
b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index c4cb57e3f32b..ffd6fdc361d2 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -64,8 +64,10 @@ bool canHighlightName(DeclarationName Name) {
   llvm_unreachable("invalid name kind");
 }
 
-llvm::Optional kindForType(const Type *TP);
-llvm::Optional kindForDecl(const NamedDecl *D) {
+llvm::Optional kindForType(const Type *TP,
+ const HeuristicResolver 
*Resolver);
+llvm::Optional
+kindForDecl(const NamedDecl *D, const HeuristicResolver *Resolver) {
   if (auto *USD = dyn_cast(D)) {
 if (auto *Target = USD->getTargetDecl())
   D = Target;
@@ -76,7 +78,8 @@ llvm::Optional kindForDecl(const NamedDecl 
*D) {
   }
   if (auto *TD = dyn_cast(D)) {
 // We try to highlight typedefs as their underlying type.
-if (auto K = kindForType(TD->getUnderlyingType().getTypePtrOrNull()))
+if (auto K =
+kindForType(TD->getUnderlyingType().getTypePtrOrNull(), Resolver))
   return K;
 // And fallback to a generic kind if this fails.
 return HighlightingKind::Typedef;
@@ -133,23 +136,27 @@ llvm::Optional kindForDecl(const 
NamedDecl *D) {
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
-  if (isa(D)) {
-// FIXME: We may be able to do better using HeuristicResolver.
+  if (const auto *UUVD = dyn_cast(D)) {
+auto Targets = Resolver->resolveUsingValueDecl(UUVD);
+if (!Targets.empty()) {
+  return kindForDecl(Targets[0], Resolver);
+}
 return HighlightingKind::Unknown;
   }
   return llvm::None;
 }
-llvm::Optional kindForType(const Type *TP) {
+llvm::Optional
+kindForType(const Type *TP, const HeuristicResolver *Resolver) {
   if (!TP)
 return llvm::None;
   if (TP->isBuiltinType()) // Builtins are special, they do not have decls.
 return HighlightingKind::Primitive;
   if (auto *TD = dyn_cast(TP))
-return kindForDecl(TD->getDecl());
+return kindForDecl(TD->getDecl(), Resolver);
   if (isa(TP))
 return HighlightingKind::Class;
   if (auto *TD = TP->getAsTagDecl())
-return kindForDecl(TD);
+return kindForDecl(TD, Resolver);
   return llvm::None;
 }
 
@@ -400,11 +407,14 @@ class HighlightingsBuilder {
 return WithInactiveLines;
   }
 
+  const HeuristicResolver *getResolver() const { return Resolver; }
+
 private:
   const syntax::TokenBuffer &TB;
   const SourceManager &SourceMgr;
   const LangOptions &LangOpts;
   std::vector Tokens;
+  const HeuristicResolver *Resolver;
   // returned from addToken(InvalidLoc)
   HighlightingToken InvalidHighlightingToken;
 };
@@ -457,7 +467,7 @@ class CollectExtraHighlightings
   CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {}
 
   bool VisitDecltypeTypeLoc(DecltypeTypeLoc L) {
-if (auto K = kindForType(L.getTypePtr())) {
+if (auto K = kindForType(L.getTypePtr(), H.getResolver())) {
   auto &Tok = H.addToken(L.getBeginLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(L.getTypePtr()))
@@ -470,7 +480,8 @@ class CollectExtraHighlightings
 auto *AT = D->getType()->getContainedAutoType();
 if (!AT)
   return true;
-if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull())) {
+if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(),
+ H.getResolver())) {
   auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(AT->getDeducedType().getTypePtrOrNull()))
@@ -611,7 +622,7 @@ std::vector 
getSemanticHighlightings(ParsedAST &AST) {
 for (const NamedDecl *Decl : R.Targets) {
   if (!canHighlightName(Decl->getDeclName()))
 continue;
-  auto Kind = kindForDecl(Decl);
+  auto Kind = kindForDecl(Decl, AST.getHeuristicResolver());
   if (!Kind)
 continue;
   auto &Tok = Builder.addToken(R.NameLoc, *Kind);

diff  --git a/clang-tools-extra/clangd/u

[clang-tools-extra] ddfe13e - [clangd] Produce semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-04-25T16:43:58-04:00
New Revision: ddfe13e757cb72c056cba8d889d6cb8ee69f1afa

URL: 
https://github.com/llvm/llvm-project/commit/ddfe13e757cb72c056cba8d889d6cb8ee69f1afa
DIFF: 
https://github.com/llvm/llvm-project/commit/ddfe13e757cb72c056cba8d889d6cb8ee69f1afa.diff

LOG: [clangd] Produce semantic token for name referring to 
UnresolvedUsingValueDecl

For now, use the token kind Unknown. We may be able to improve on this
using HeuristicResolver.

Differential Revision: https://reviews.llvm.org/D99052

Added: 


Modified: 
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp 
b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index cf06eac01a34..c4cb57e3f32b 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@ llvm::Optional kindForDecl(const 
NamedDecl *D) {
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
+  if (isa(D)) {
+// FIXME: We may be able to do better using HeuristicResolver.
+return HighlightingKind::Unknown;
+  }
   return llvm::None;
 }
 llvm::Optional kindForType(const Type *TP) {
@@ -228,6 +232,12 @@ bool isAbstract(const Decl *D) {
   return false;
 }
 
+bool isDependent(const Decl *D) {
+  if (isa(D))
+return true;
+  return false;
+}
+
 // For a macro usage `DUMP(foo)`, we want:
 //  - DUMP --> "macro"
 //  - foo --> "variable".
@@ -619,9 +629,14 @@ std::vector 
getSemanticHighlightings(ParsedAST &AST) {
 Tok.addModifier(HighlightingModifier::Static);
   if (isAbstract(Decl))
 Tok.addModifier(HighlightingModifier::Abstract);
+  if (isDependent(Decl))
+Tok.addModifier(HighlightingModifier::DependentName);
   if (Decl->isDeprecated())
 Tok.addModifier(HighlightingModifier::Deprecated);
-  if (R.IsDecl)
+  // Do not treat an UnresolvedUsingValueDecl as a declaration.
+  // It's more common to think of it as a reference to the
+  // underlying declaration.
+  if (R.IsDecl && !isa(Decl))
 Tok.addModifier(HighlightingModifier::Declaration);
 }
   },

diff  --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp 
b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index d8dc3b061df5..7e979ee4e75d 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@ sizeof...($TemplateParameter[[Elements]]);
 @implementation $Class[[Foo]]($Namespace_decl[[Bar]])
 @end
   )cpp",
+  // Member imported from dependent base
+  R"cpp(
+template  struct $Class_decl[[Base]] {
+  int $Field_decl[[member]];
+};
+template 
+struct $Class_decl[[Derived]] : 
$Class[[Base]]<$TemplateParameter[[T]]> {
+  using 
$Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+  void $Method_decl[[method]]() {
+(void)$Unknown_dependentName[[member]];
+  }
+};
+  )cpp",
   };
   for (const auto &TestCase : TestCases)
 // Mask off scope modifiers to keep the tests manageable.



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D99056: [clangd] Use HeuristicResolver to produce a better semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340382.
nridge added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99056/new/

https://reviews.llvm.org/D99056

Files:
  clang-tools-extra/clangd/SemanticHighlighting.cpp
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -695,10 +695,10 @@
 };
 template 
 struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
-  using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+  using $Class[[Base]]<$TemplateParameter[[T]]>::$Field_dependentName[[member]];
 
   void $Method_decl[[method]]() {
-(void)$Unknown_dependentName[[member]];
+(void)$Field_dependentName[[member]];
   }
 };
   )cpp",
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -64,8 +64,10 @@
   llvm_unreachable("invalid name kind");
 }
 
-llvm::Optional kindForType(const Type *TP);
-llvm::Optional kindForDecl(const NamedDecl *D) {
+llvm::Optional kindForType(const Type *TP,
+ const HeuristicResolver *Resolver);
+llvm::Optional
+kindForDecl(const NamedDecl *D, const HeuristicResolver *Resolver) {
   if (auto *USD = dyn_cast(D)) {
 if (auto *Target = USD->getTargetDecl())
   D = Target;
@@ -76,7 +78,8 @@
   }
   if (auto *TD = dyn_cast(D)) {
 // We try to highlight typedefs as their underlying type.
-if (auto K = kindForType(TD->getUnderlyingType().getTypePtrOrNull()))
+if (auto K =
+kindForType(TD->getUnderlyingType().getTypePtrOrNull(), Resolver))
   return K;
 // And fallback to a generic kind if this fails.
 return HighlightingKind::Typedef;
@@ -133,23 +136,27 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
-  if (isa(D)) {
-// FIXME: We may be able to do better using HeuristicResolver.
+  if (const auto *UUVD = dyn_cast(D)) {
+auto Targets = Resolver->resolveUsingValueDecl(UUVD);
+if (!Targets.empty()) {
+  return kindForDecl(Targets[0], Resolver);
+}
 return HighlightingKind::Unknown;
   }
   return llvm::None;
 }
-llvm::Optional kindForType(const Type *TP) {
+llvm::Optional
+kindForType(const Type *TP, const HeuristicResolver *Resolver) {
   if (!TP)
 return llvm::None;
   if (TP->isBuiltinType()) // Builtins are special, they do not have decls.
 return HighlightingKind::Primitive;
   if (auto *TD = dyn_cast(TP))
-return kindForDecl(TD->getDecl());
+return kindForDecl(TD->getDecl(), Resolver);
   if (isa(TP))
 return HighlightingKind::Class;
   if (auto *TD = TP->getAsTagDecl())
-return kindForDecl(TD);
+return kindForDecl(TD, Resolver);
   return llvm::None;
 }
 
@@ -400,11 +407,14 @@
 return WithInactiveLines;
   }
 
+  const HeuristicResolver *getResolver() const { return Resolver; }
+
 private:
   const syntax::TokenBuffer &TB;
   const SourceManager &SourceMgr;
   const LangOptions &LangOpts;
   std::vector Tokens;
+  const HeuristicResolver *Resolver;
   HighlightingToken Dummy; // returned from addToken(InvalidLoc)
 };
 
@@ -456,7 +466,7 @@
   CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {}
 
   bool VisitDecltypeTypeLoc(DecltypeTypeLoc L) {
-if (auto K = kindForType(L.getTypePtr())) {
+if (auto K = kindForType(L.getTypePtr(), H.getResolver())) {
   auto &Tok = H.addToken(L.getBeginLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(L.getTypePtr()))
@@ -469,7 +479,8 @@
 auto *AT = D->getType()->getContainedAutoType();
 if (!AT)
   return true;
-if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull())) {
+if (auto K = kindForType(AT->getDeducedType().getTypePtrOrNull(),
+ H.getResolver())) {
   auto &Tok = H.addToken(D->getTypeSpecStartLoc(), *K)
   .addModifier(HighlightingModifier::Deduced);
   if (auto Mod = scopeModifier(AT->getDeducedType().getTypePtrOrNull()))
@@ -610,7 +621,7 @@
 for (const NamedDecl *Decl : R.Targets) {
   if (!canHighlightName(Decl->getDeclName()))
 continue;
-  auto Kind = kindForDecl(Decl);
+  auto Kind = kindForDecl(Decl, AST.getHeuristicResolver());
   if (!Kind)
 continue;
   auto &Tok = Builder.addToken(R.NameLoc, *Kind);
__

[PATCH] D99052: [clangd] Produce semantic token for name referring to UnresolvedUsingValueDecl

2021-04-25 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 340381.
nridge added a comment.

Address review comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D99052/new/

https://reviews.llvm.org/D99052

Files:
  clang-tools-extra/clangd/SemanticHighlighting.cpp
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@
 @implementation $Class[[Foo]]($Namespace_decl[[Bar]])
 @end
   )cpp",
+  // Member imported from dependent base
+  R"cpp(
+template  struct $Class_decl[[Base]] {
+  int $Field_decl[[member]];
+};
+template 
+struct $Class_decl[[Derived]] : 
$Class[[Base]]<$TemplateParameter[[T]]> {
+  using 
$Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+  void $Method_decl[[method]]() {
+(void)$Unknown_dependentName[[member]];
+  }
+};
+  )cpp",
   };
   for (const auto &TestCase : TestCases)
 // Mask off scope modifiers to keep the tests manageable.
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
+  if (isa(D)) {
+// FIXME: We may be able to do better using HeuristicResolver.
+return HighlightingKind::Unknown;
+  }
   return llvm::None;
 }
 llvm::Optional kindForType(const Type *TP) {
@@ -228,6 +232,12 @@
   return false;
 }
 
+bool isDependent(const Decl *D) {
+  if (isa(D))
+return true;
+  return false;
+}
+
 // For a macro usage `DUMP(foo)`, we want:
 //  - DUMP --> "macro"
 //  - foo --> "variable".
@@ -618,9 +628,14 @@
 Tok.addModifier(HighlightingModifier::Static);
   if (isAbstract(Decl))
 Tok.addModifier(HighlightingModifier::Abstract);
+  if (isDependent(Decl))
+Tok.addModifier(HighlightingModifier::DependentName);
   if (Decl->isDeprecated())
 Tok.addModifier(HighlightingModifier::Deprecated);
-  if (R.IsDecl)
+  // Do not treat an UnresolvedUsingValueDecl as a declaration.
+  // It's more common to think of it as a reference to the
+  // underlying declaration.
+  if (R.IsDecl && !isa(Decl))
 Tok.addModifier(HighlightingModifier::Declaration);
 }
   },


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -688,6 +688,20 @@
 @implementation $Class[[Foo]]($Namespace_decl[[Bar]])
 @end
   )cpp",
+  // Member imported from dependent base
+  R"cpp(
+template  struct $Class_decl[[Base]] {
+  int $Field_decl[[member]];
+};
+template 
+struct $Class_decl[[Derived]] : $Class[[Base]]<$TemplateParameter[[T]]> {
+  using $Class[[Base]]<$TemplateParameter[[T]]>::$Unknown_dependentName[[member]];
+
+  void $Method_decl[[method]]() {
+(void)$Unknown_dependentName[[member]];
+  }
+};
+  )cpp",
   };
   for (const auto &TestCase : TestCases)
 // Mask off scope modifiers to keep the tests manageable.
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -133,6 +133,10 @@
 return HighlightingKind::TemplateParameter;
   if (isa(D))
 return HighlightingKind::Concept;
+  if (isa(D)) {
+// FIXME: We may be able to do better using HeuristicResolver.
+return HighlightingKind::Unknown;
+  }
   return llvm::None;
 }
 llvm::Optional kindForType(const Type *TP) {
@@ -228,6 +232,12 @@
   return false;
 }
 
+bool isDependent(const Decl *D) {
+  if (isa(D))
+return true;
+  return false;
+}
+
 // For a macro usage `DUMP(foo)`, we want:
 //  - DUMP --> "macro"
 //  - foo --> "variable".
@@ -618,9 +628,14 @@
 Tok.addModifier(HighlightingModifier::Static);
   if (isAbstract(Decl))
 Tok.addModifier(HighlightingModifier::Abstract);
+  if (isDependent(Decl))
+Tok.addModifier(HighlightingModifier::DependentName);
   if (Decl->isDeprecated())
 Tok.addModifier(HighlightingModifier::Deprecated);

[PATCH] D101214: Disable deprecated-copy warnings on various LLVM code to bring the bot back to green

2021-04-25 Thread Vitaly Buka via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG504eee28fe0f: Disable deprecated-copy warnings on various 
LLVM code to bring the bot back to… (authored by nemanjai, committed by 
vitalybuka).

Changed prior to commit:
  https://reviews.llvm.org/D101214?vs=340209&id=340379#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101214/new/

https://reviews.llvm.org/D101214

Files:
  llvm/utils/unittest/googlemock/include/gmock/gmock.h


Index: llvm/utils/unittest/googlemock/include/gmock/gmock.h
===
--- llvm/utils/unittest/googlemock/include/gmock/gmock.h
+++ llvm/utils/unittest/googlemock/include/gmock/gmock.h
@@ -55,6 +55,11 @@
 //
 // where all clauses are optional and WillOnce() can be repeated.
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-copy"
+#endif
+
 #include "gmock/gmock-actions.h"
 #include "gmock/gmock-cardinalities.h"
 #include "gmock/gmock-generated-actions.h"
@@ -91,4 +96,7 @@
 
 }  // namespace testing
 
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_H_


Index: llvm/utils/unittest/googlemock/include/gmock/gmock.h
===
--- llvm/utils/unittest/googlemock/include/gmock/gmock.h
+++ llvm/utils/unittest/googlemock/include/gmock/gmock.h
@@ -55,6 +55,11 @@
 //
 // where all clauses are optional and WillOnce() can be repeated.
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-copy"
+#endif
+
 #include "gmock/gmock-actions.h"
 #include "gmock/gmock-cardinalities.h"
 #include "gmock/gmock-generated-actions.h"
@@ -91,4 +96,7 @@
 
 }  // namespace testing
 
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_H_
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 68ff493 - [NFC] Fixed some D79714 warnings

2021-04-25 Thread Vitaly Buka via cfe-commits

Author: Vitaly Buka
Date: 2021-04-25T12:41:46-07:00
New Revision: 68ff493dfc950c05c102e09e14a16d06253ffa16

URL: 
https://github.com/llvm/llvm-project/commit/68ff493dfc950c05c102e09e14a16d06253ffa16
DIFF: 
https://github.com/llvm/llvm-project/commit/68ff493dfc950c05c102e09e14a16d06253ffa16.diff

LOG: [NFC] Fixed some D79714 warnings

Added: 


Modified: 
clang/include/clang/Basic/OpenCLOptions.h
llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h
mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
mlir/include/mlir/Support/TypeID.h
mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index 703b5ac48094..17923d2b8d3c 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -154,7 +154,6 @@ class OpenCLOptions {
   void support(llvm::StringRef Ext, bool V = true);
 
   OpenCLOptions();
-  OpenCLOptions(const OpenCLOptions &) = default;
 
   // Set supported options based on target settings and language version
   void addSupport(const llvm::StringMap &FeaturesMap,

diff  --git 
a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h 
b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h
index d210fd909290..e1c2c50be773 100644
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h
@@ -1380,6 +1380,12 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, 
M8 m8, M9 m9, M10 m10) {
 // To learn more about using these macros, please search for 'MATCHER'
 // on http://code.google.com/p/googlemock/wiki/CookBook.
 
+#define GTEST_DISALLOW_ASSIGN_MATCHER_(type)\
+public:\
+  type(type const &) = default;\
+private:\
+  void operator=(type const &) = delete;
+
 #define MATCHER(name, description)\
   class name##Matcher {\
public:\
@@ -1416,7 +1422,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 name##Matcher() {\
 }\
private:\
-GTEST_DISALLOW_ASSIGN_(name##Matcher);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##Matcher);\
   };\
   inline name##Matcher name() {\
 return name##Matcher();\
@@ -1466,7 +1472,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 }\
 p0##_type p0;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP);\
   };\
   template \
   inline name##MatcherP name(p0##_type p0) {\
@@ -1521,7 +1527,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p0##_type p0;\
 p1##_type p1;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP2);\
   };\
   template \
   inline name##MatcherP2 name(p0##_type p0, \
@@ -1581,7 +1587,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p1##_type p1;\
 p2##_type p2;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP3);\
   };\
   template \
   inline name##MatcherP3 name(p0##_type p0, \
@@ -1646,7 +1652,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p2##_type p2;\
 p3##_type p3;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP4);\
   };\
   template \
@@ -1719,7 +1725,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p3##_type p3;\
 p4##_type p4;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP5);\
   };\
   template \
@@ -1794,7 +1800,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p4##_type p4;\
 p5##_type p5;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP6);\
   };\
   template \
@@ -1875,7 +1881,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 
m8, M9 m9, M10 m10) {
 p5##_type p5;\
 p6##_type p6;\
private:\
-GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\
+GTEST_DISALLOW_ASSIGN_MATCHER_(name##MatcherP7);\
   };\
   template  loops;
   SmallVector tensorResults;
-  TiledLinalgOp &operator=(const TiledLinalgOp &) = default;
 };
 Optional tileLinalgOp(OpBuilder &b, LinalgOp op,
  const LinalgTilingOptions &options);

diff  --git a/mlir/include/mlir/Support/TypeID.h 
b/mlir/include/mlir/Support/TypeID.h
index fb8a2215b669..2e4d8b9e8377 100644
--- a/mlir/include/mlir/Support/TypeID.h
+++ b/mlir/include/mlir/Support/TypeID.h
@@ -57,7 +57,6 @@ class TypeID {
 
 public:
   TypeID() : Type

[PATCH] D101248: [RISCV] [1/2] Add IR intrinsic for Zbm extension

2021-04-25 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added inline comments.



Comment at: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbm.c:16
+//
+long clmul(long a, long b) {
+  return __builtin_riscv_bmator(a, b);

clmul?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101248/new/

https://reviews.llvm.org/D101248

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101143: [RISCV] [1/2] Add IR intrinsic for Zbe extension

2021-04-25 Thread Craig Topper via Phabricator via cfe-commits
craig.topper accepted this revision.
craig.topper added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101143/new/

https://reviews.llvm.org/D101143

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101259: [clang-tidy] Fix cppcoreguidelines-pro-type-vararg false positives with __builtin_ms_va_list

2021-04-25 Thread Georgy Komarov via Phabricator via cfe-commits
jubnzv created this revision.
jubnzv added reviewers: njames93, aaron.ballman.
jubnzv added a project: clang-tools-extra.
Herald added subscribers: shchenz, kbarton, xazax.hun, nemanjai.
jubnzv requested review of this revision.

This commit fixes `cppcoreguidelines-pro-type-vararg` false positives on `char 
*` variables.

The incorrect warnings generated by clang-tidy can be illustrated with the 
following minimal example:

  void foo(char* in) {
char *tmp = in;
  }

The problem is that `__builtin_ms_va_list` desugared as `char *`, which leads 
to false positives.

This commit fixes the following bugzilla issue: 
https://bugs.llvm.org/show_bug.cgi?id=48042.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101259

Files:
  clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeVarargCheck.cpp
  
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp
  
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp


Index: 
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
===
--- 
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
+++ 
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
@@ -58,3 +58,7 @@
   (void)__builtin_isinf_sign(0.f);
   (void)__builtin_prefetch(nullptr);
 }
+
+// __builtin_ms_va_list desugared as 'char *'. This test checks whether we are
+// handling this case correctly and not generating false positives.
+void no_false_positive_desugar_ms_va_list(char *in) { char *tmp = in; }
Index: 
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp
===
--- /dev/null
+++ 
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp
@@ -0,0 +1,26 @@
+// Purpose:
+// Ensure that the 'cppcoreguidelines-pro-type-vararg' check works with the
+// built-in va_list on Windows systems.
+
+// REQUIRES: system-windows
+
+// RUN: %check_clang_tidy %s cppcoreguidelines-pro-type-vararg %t
+
+void test_ms_va_list(int a, ...) {
+  __builtin_ms_va_list ap;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type 
va_list; use variadic templates instead
+  __builtin_ms_va_start(ap, a);
+  int b = __builtin_va_arg(ap, int);
+  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not use va_arg to define 
c-style vararg functions; use variadic templates instead
+  __builtin_ms_va_end(ap);
+}
+
+void test_typedefs(int a, ...) {
+  typedef __builtin_ms_va_list my_va_list1;
+  my_va_list1 ap1;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type 
va_list; use variadic templates instead
+
+  using my_va_list2 = __builtin_ms_va_list;
+  my_va_list2 ap2;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare variables of type 
va_list; use variadic templates instead
+}
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeVarargCheck.cpp
===
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeVarargCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeVarargCheck.cpp
@@ -60,8 +60,22 @@
 AST_MATCHER(QualType, isVAList) {
   ASTContext &Context = Finder->getASTContext();
   QualType Desugar = Node.getDesugaredType(Context);
-  return Context.getBuiltinVaListType().getDesugaredType(Context) == Desugar ||
- Context.getBuiltinMSVaListType().getDesugaredType(Context) == Desugar;
+
+  // __builtin_ms_va_list is internally implemented as 'char *'. This means 
that
+  // the node desugared as 'char *' potentially can be a __builtin_ms_va_list.
+  // So we need to remove all typedefs one by one to check this.
+  if (Desugar == Context.getBuiltinMSVaListType().getDesugaredType(Context)) {
+const auto MSVaListType = Context.getBuiltinMSVaListType();
+QualType Ty;
+do {
+  Ty = Desugar;
+  Desugar = Ty.getSingleStepDesugaredType(Context);
+  if (Desugar == MSVaListType)
+return true;
+} while (Desugar != Ty);
+  }
+
+  return Context.getBuiltinVaListType().getDesugaredType(Context) == Desugar;
 }
 
 AST_MATCHER_P(AdjustedType, hasOriginalType,


Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg.cpp
@@ -58,3 +58,7 @@
   (void)__builtin_isinf_sign(0.f);
   (void)__builtin_prefetch(nullptr);
 }
+
+// __builtin_ms_va_list desugared as 'char *'. This test checks whether we are
+// handling this case correctly and not generating false positives.
+void no_false_positive_desugar_ms_va_list(char *in) { char *tmp = in; }
Index: clang-tools-extra/test/clang-tid

[PATCH] D98657: [flang][driver] Add options for -Werror

2021-04-25 Thread Arnamoy B via Phabricator via cfe-commits
arnamoy10 added a comment.

In D98657#2701673 , @crownyanguan 
wrote:

> How about -Wl option, it will cause link error  like " Only `-Werror` is 
> supported currently"

Thanks for pointing it out.  The issue was due to restricting -W` options in 
`f18` as well, this has been fixed with `4299ab6c5daf`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98657/new/

https://reviews.llvm.org/D98657

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D93325: Add srcloc output to clang-query

2021-04-25 Thread Stephen Kelly via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG8d018c79ee5f: Add srcloc output to clang-query (authored by 
stephenkelly).

Changed prior to commit:
  https://reviews.llvm.org/D93325?vs=339583&id=340351#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D93325/new/

https://reviews.llvm.org/D93325

Files:
  clang-tools-extra/clang-query/CMakeLists.txt
  clang-tools-extra/clang-query/Query.cpp
  clang-tools-extra/clang-query/Query.h
  clang-tools-extra/clang-query/QueryParser.cpp
  clang-tools-extra/clang-query/QuerySession.h
  clang-tools-extra/unittests/clang-query/QueryParserTest.cpp

Index: clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
===
--- clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
+++ clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
@@ -218,7 +218,7 @@
   EXPECT_EQ("output", Comps[0].DisplayText);
 
   Comps = QueryParser::complete("enable output ", 14, QS);
-  ASSERT_EQ(4u, Comps.size());
+  ASSERT_EQ(5u, Comps.size());
 
   EXPECT_EQ("diag ", Comps[0].TypedText);
   EXPECT_EQ("diag", Comps[0].DisplayText);
@@ -226,8 +226,10 @@
   EXPECT_EQ("print", Comps[1].DisplayText);
   EXPECT_EQ("detailed-ast ", Comps[2].TypedText);
   EXPECT_EQ("detailed-ast", Comps[2].DisplayText);
-  EXPECT_EQ("dump ", Comps[3].TypedText);
-  EXPECT_EQ("dump", Comps[3].DisplayText);
+  EXPECT_EQ("srcloc ", Comps[3].TypedText);
+  EXPECT_EQ("srcloc", Comps[3].DisplayText);
+  EXPECT_EQ("dump ", Comps[4].TypedText);
+  EXPECT_EQ("dump", Comps[4].DisplayText);
 
   Comps = QueryParser::complete("set traversal ", 14, QS);
   ASSERT_EQ(2u, Comps.size());
Index: clang-tools-extra/clang-query/QuerySession.h
===
--- clang-tools-extra/clang-query/QuerySession.h
+++ clang-tools-extra/clang-query/QuerySession.h
@@ -25,14 +25,15 @@
 public:
   QuerySession(llvm::ArrayRef> ASTs)
   : ASTs(ASTs), PrintOutput(false), DiagOutput(true),
-DetailedASTOutput(false), BindRoot(true), PrintMatcher(false),
-Terminate(false), TK(TK_AsIs) {}
+DetailedASTOutput(false), SrcLocOutput(false), BindRoot(true),
+PrintMatcher(false), Terminate(false), TK(TK_AsIs) {}
 
   llvm::ArrayRef> ASTs;
 
   bool PrintOutput;
   bool DiagOutput;
   bool DetailedASTOutput;
+  bool SrcLocOutput;
 
   bool BindRoot;
   bool PrintMatcher;
Index: clang-tools-extra/clang-query/QueryParser.cpp
===
--- clang-tools-extra/clang-query/QueryParser.cpp
+++ clang-tools-extra/clang-query/QueryParser.cpp
@@ -108,6 +108,7 @@
  .Case("diag", OK_Diag)
  .Case("print", OK_Print)
  .Case("detailed-ast", OK_DetailedAST)
+ .Case("srcloc", OK_SrcLoc)
  .Case("dump", OK_DetailedAST)
  .Default(~0u);
   if (OutKind == ~0u) {
@@ -123,6 +124,8 @@
 return new QueryType(&QuerySession::DiagOutput);
   case OK_Print:
 return new QueryType(&QuerySession::PrintOutput);
+  case OK_SrcLoc:
+return new QueryType(&QuerySession::SrcLocOutput);
   }
 
   llvm_unreachable("Invalid output kind");
Index: clang-tools-extra/clang-query/Query.h
===
--- clang-tools-extra/clang-query/Query.h
+++ clang-tools-extra/clang-query/Query.h
@@ -18,7 +18,7 @@
 namespace clang {
 namespace query {
 
-enum OutputKind { OK_Diag, OK_Print, OK_DetailedAST };
+enum OutputKind { OK_Diag, OK_Print, OK_DetailedAST, OK_SrcLoc };
 
 enum QueryKind {
   QK_Invalid,
Index: clang-tools-extra/clang-query/Query.cpp
===
--- clang-tools-extra/clang-query/Query.cpp
+++ clang-tools-extra/clang-query/Query.cpp
@@ -12,6 +12,7 @@
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/TextDiagnostic.h"
+#include "clang/Tooling/NodeIntrospection.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace clang::ast_matchers;
@@ -66,6 +67,8 @@
 "Diagnostic location for bound nodes.\n"
 "  detailed-ast  "
 "Detailed AST output for bound nodes.\n"
+"  srcloc"
+"Source locations and ranges for bound nodes.\n"
 "  dump  "
 "Detailed AST output for bound nodes (alias of detailed-ast).\n\n";
   return true;
@@ -86,6 +89,90 @@
   }
 };
 
+void dumpLocations(llvm::raw_ostream &OS, DynTypedNode Node, ASTContext &Ctx,
+   const DiagnosticsEngine &Diags, SourceManager const &SM) {
+  auto Locs = clang::tooling::NodeIntrospection::GetLocations(Node);
+
+  auto PrintLocat

[clang-tools-extra] 8d018c7 - Add srcloc output to clang-query

2021-04-25 Thread Stephen Kelly via cfe-commits

Author: Stephen Kelly
Date: 2021-04-25T12:12:04+01:00
New Revision: 8d018c79ee5f14e1433b8cbb02dd89d0941516ff

URL: 
https://github.com/llvm/llvm-project/commit/8d018c79ee5f14e1433b8cbb02dd89d0941516ff
DIFF: 
https://github.com/llvm/llvm-project/commit/8d018c79ee5f14e1433b8cbb02dd89d0941516ff.diff

LOG: Add srcloc output to clang-query

Differential Revision: https://reviews.llvm.org/D93325

Added: 


Modified: 
clang-tools-extra/clang-query/CMakeLists.txt
clang-tools-extra/clang-query/Query.cpp
clang-tools-extra/clang-query/Query.h
clang-tools-extra/clang-query/QueryParser.cpp
clang-tools-extra/clang-query/QuerySession.h
clang-tools-extra/unittests/clang-query/QueryParserTest.cpp

Removed: 




diff  --git a/clang-tools-extra/clang-query/CMakeLists.txt 
b/clang-tools-extra/clang-query/CMakeLists.txt
index 043d26147a7f..8355ef0aba5e 100644
--- a/clang-tools-extra/clang-query/CMakeLists.txt
+++ b/clang-tools-extra/clang-query/CMakeLists.txt
@@ -19,6 +19,7 @@ clang_target_link_libraries(clangQuery
   clangBasic
   clangDynamicASTMatchers
   clangFrontend
+  clangTooling
   clangSerialization
   )
 

diff  --git a/clang-tools-extra/clang-query/Query.cpp 
b/clang-tools-extra/clang-query/Query.cpp
index 5cf24dbb58a7..2c169b1f9a7f 100644
--- a/clang-tools-extra/clang-query/Query.cpp
+++ b/clang-tools-extra/clang-query/Query.cpp
@@ -12,6 +12,7 @@
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/TextDiagnostic.h"
+#include "clang/Tooling/NodeIntrospection.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace clang::ast_matchers;
@@ -66,6 +67,8 @@ bool HelpQuery::run(llvm::raw_ostream &OS, QuerySession &QS) 
const {
 "Diagnostic location for bound nodes.\n"
 "  detailed-ast  "
 "Detailed AST output for bound nodes.\n"
+"  srcloc"
+"Source locations and ranges for bound nodes.\n"
 "  dump  "
 "Detailed AST output for bound nodes (alias of detailed-ast).\n\n";
   return true;
@@ -86,6 +89,90 @@ struct CollectBoundNodes : MatchFinder::MatchCallback {
   }
 };
 
+void dumpLocations(llvm::raw_ostream &OS, DynTypedNode Node, ASTContext &Ctx,
+   const DiagnosticsEngine &Diags, SourceManager const &SM) {
+  auto Locs = clang::tooling::NodeIntrospection::GetLocations(Node);
+
+  auto PrintLocations = [](llvm::raw_ostream &OS, auto Iter, auto End) {
+auto CommonEntry = Iter->first;
+auto Scout = Iter;
+SmallVector LocationStrings;
+while (Scout->first == CommonEntry) {
+  LocationStrings.push_back(
+  tooling::LocationCallFormatterCpp::format(*Iter->second));
+  if (Scout == End)
+break;
+  ++Scout;
+  if (Scout->first == CommonEntry)
+++Iter;
+}
+llvm::sort(LocationStrings);
+for (auto &LS : LocationStrings) {
+  OS << " * \"" << LS << "\"\n";
+}
+return Iter;
+  };
+
+  TextDiagnostic TD(OS, Ctx.getLangOpts(), &Diags.getDiagnosticOptions());
+
+  for (auto Iter = Locs.LocationAccessors.begin();
+   Iter != Locs.LocationAccessors.end(); ++Iter) {
+if (!Iter->first.isValid())
+  continue;
+
+TD.emitDiagnostic(FullSourceLoc(Iter->first, SM), DiagnosticsEngine::Note,
+  "source locations here", None, None);
+
+Iter = PrintLocations(OS, Iter, Locs.LocationAccessors.end());
+OS << '\n';
+  }
+
+  for (auto Iter = Locs.RangeAccessors.begin();
+   Iter != Locs.RangeAccessors.end(); ++Iter) {
+
+if (!Iter->first.getBegin().isValid())
+  continue;
+
+if (SM.getPresumedLineNumber(Iter->first.getBegin()) !=
+SM.getPresumedLineNumber(Iter->first.getEnd()))
+  continue;
+
+TD.emitDiagnostic(FullSourceLoc(Iter->first.getBegin(), SM),
+  DiagnosticsEngine::Note,
+  "source ranges here " + Iter->first.printToString(SM),
+  CharSourceRange::getTokenRange(Iter->first), None);
+
+Iter = PrintLocations(OS, Iter, Locs.RangeAccessors.end());
+  }
+  for (auto Iter = Locs.RangeAccessors.begin();
+   Iter != Locs.RangeAccessors.end(); ++Iter) {
+
+if (!Iter->first.getBegin().isValid())
+  continue;
+
+if (SM.getPresumedLineNumber(Iter->first.getBegin()) ==
+SM.getPresumedLineNumber(Iter->first.getEnd()))
+  continue;
+
+TD.emitDiagnostic(
+FullSourceLoc(Iter->first.getBegin(), SM), DiagnosticsEngine::Note,
+"source range " + Iter->first.printToString(SM) + " starting here...",
+CharSourceRange::getTokenRange(Iter->first), None);
+
+auto ColNum = SM.getPresumedColumnNumber(Iter->first.getEnd());
+auto LastLineLoc = Iter->first.getEnd().getLocWithOffset(-(ColNum - 1));
+
+TD.emitDiagnostic(FullSourceLoc(Iter->first.getEnd(), SM),
+ 

[PATCH] D101049: [AST] Add DeclarationNameInfo to node introspection

2021-04-25 Thread Stephen Kelly via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa9676febb99d: [AST] Add DeclarationNameInfo to node 
introspection (authored by stephenkelly).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101049/new/

https://reviews.llvm.org/D101049

Files:
  clang/include/clang/Tooling/NodeIntrospection.h
  clang/lib/Tooling/DumpTool/APIData.h
  clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp
  clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py
  clang/lib/Tooling/EmptyNodeIntrospection.inc.in
  clang/unittests/Introspection/IntrospectionTest.cpp

Index: clang/unittests/Introspection/IntrospectionTest.cpp
===
--- clang/unittests/Introspection/IntrospectionTest.cpp
+++ clang/unittests/Introspection/IntrospectionTest.cpp
@@ -216,6 +216,9 @@
 STRING_LOCATION_STDPAIR(MethodDecl, getEndLoc()),
 STRING_LOCATION_STDPAIR(MethodDecl, getInnerLocStart()),
 STRING_LOCATION_STDPAIR(MethodDecl, getLocation()),
+STRING_LOCATION_STDPAIR(MethodDecl, getNameInfo().getBeginLoc()),
+STRING_LOCATION_STDPAIR(MethodDecl, getNameInfo().getEndLoc()),
+STRING_LOCATION_STDPAIR(MethodDecl, getNameInfo().getLoc()),
 STRING_LOCATION_STDPAIR(MethodDecl, getOuterLocStart()),
 STRING_LOCATION_STDPAIR(MethodDecl, getQualifierLoc().getBeginLoc()),
 STRING_LOCATION_STDPAIR(MethodDecl, getQualifierLoc().getEndLoc()),
@@ -305,6 +308,7 @@
 llvm::makeArrayRef(ExpectedRanges),
   (ArrayRef>{
 STRING_LOCATION_STDPAIR(MethodDecl, getExceptionSpecSourceRange()),
+STRING_LOCATION_STDPAIR(MethodDecl, getNameInfo().getSourceRange()),
 STRING_LOCATION_STDPAIR(MethodDecl, getParametersSourceRange()),
 STRING_LOCATION_STDPAIR(MethodDecl, getQualifierLoc().getLocalSourceRange()),
 STRING_LOCATION_STDPAIR(MethodDecl, getQualifierLoc().getPrefix().getLocalSourceRange()),
@@ -1395,3 +1399,142 @@
   TL, getAs().getParensRange(;
 }
 #endif
+
+TEST(Introspection, SourceLocations_DeclarationNameInfo_Dtor) {
+  if (!NodeIntrospection::hasIntrospectionSupport())
+return;
+  auto AST =
+  buildASTFromCode(R"cpp(
+class Foo
+{
+  ~Foo() {}
+};
+)cpp",
+   "foo.cpp", std::make_shared());
+  auto &Ctx = AST->getASTContext();
+  auto &TU = *Ctx.getTranslationUnitDecl();
+
+  auto BoundNodes = ast_matchers::match(
+  decl(hasDescendant(cxxDestructorDecl(hasName("~Foo")).bind("dtor"))), TU,
+  Ctx);
+
+  EXPECT_EQ(BoundNodes.size(), 1u);
+
+  const auto *Dtor = BoundNodes[0].getNodeAs("dtor");
+  auto NI = Dtor->getNameInfo();
+  auto Result = NodeIntrospection::GetLocations(NI);
+
+  auto ExpectedLocations =
+  FormatExpected(Result.LocationAccessors);
+
+  llvm::sort(ExpectedLocations);
+
+  // clang-format off
+  EXPECT_EQ(
+  llvm::makeArrayRef(ExpectedLocations),
+  (ArrayRef>{
+  STRING_LOCATION_STDPAIR((&NI), getBeginLoc()),
+  STRING_LOCATION_STDPAIR((&NI), getEndLoc()),
+  STRING_LOCATION_STDPAIR((&NI), getLoc()),
+  STRING_LOCATION_STDPAIR((&NI),
+getNamedTypeInfo()->getTypeLoc().getAs().getNameLoc()),
+  STRING_LOCATION_STDPAIR(
+  (&NI), getNamedTypeInfo()->getTypeLoc().getBeginLoc()),
+  STRING_LOCATION_STDPAIR(
+  (&NI), getNamedTypeInfo()->getTypeLoc().getEndLoc())}));
+  // clang-format on
+
+  auto ExpectedRanges = FormatExpected(Result.RangeAccessors);
+
+  EXPECT_THAT(
+  ExpectedRanges,
+  UnorderedElementsAre(
+  STRING_LOCATION_PAIR(
+  (&NI), getNamedTypeInfo()->getTypeLoc().getLocalSourceRange()),
+  STRING_LOCATION_PAIR(
+  (&NI), getNamedTypeInfo()->getTypeLoc().getSourceRange()),
+  STRING_LOCATION_PAIR((&NI), getSourceRange(;
+}
+
+TEST(Introspection, SourceLocations_DeclarationNameInfo_ConvOp) {
+  if (!NodeIntrospection::hasIntrospectionSupport())
+return;
+  auto AST =
+  buildASTFromCode(R"cpp(
+class Foo
+{
+  bool operator==(const Foo&) const { return false; }
+};
+)cpp",
+   "foo.cpp", std::make_shared());
+  auto &Ctx = AST->getASTContext();
+  auto &TU = *Ctx.getTranslationUnitDecl();
+
+  auto BoundNodes = ast_matchers::match(
+  decl(hasDescendant(cxxMethodDecl().bind("opeq"))), TU, Ctx);
+
+  EXPECT_EQ(BoundNodes.size(), 1u);
+
+  const auto *Opeq = BoundNodes[0].getNodeAs("opeq");
+  auto NI = Opeq->getNameInfo();
+  auto Result = NodeIntrospection::GetLocations(NI);
+
+  auto ExpectedLocations =
+  FormatExpected(Result.LocationAccessors);
+
+  llvm::sort(ExpectedLocations);
+
+  EXPECT_EQ(llvm::makeArrayRef(ExpectedLocations),
+(ArrayRef>{
+STRING_LOCATION_STDPAIR((&NI), getBeginLoc()),
+STRING_LOCATION_STDPAIR((&NI), getEndLoc()),
+STRING_LOCATION_STDPAIR((&NI), getLoc())}));
+
+  auto ExpectedRanges = FormatExpected(Result.RangeAccessors);
+
+  EXPECT_THAT(ExpectedRanges,
+

[clang] a9676fe - [AST] Add DeclarationNameInfo to node introspection

2021-04-25 Thread Stephen Kelly via cfe-commits

Author: Stephen Kelly
Date: 2021-04-25T12:12:03+01:00
New Revision: a9676febb99d54289117a497c3fea4ba35cef2b4

URL: 
https://github.com/llvm/llvm-project/commit/a9676febb99d54289117a497c3fea4ba35cef2b4
DIFF: 
https://github.com/llvm/llvm-project/commit/a9676febb99d54289117a497c3fea4ba35cef2b4.diff

LOG: [AST] Add DeclarationNameInfo to node introspection

Differential Revision: https://reviews.llvm.org/D101049

Added: 


Modified: 
clang/include/clang/Tooling/NodeIntrospection.h
clang/lib/Tooling/DumpTool/APIData.h
clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp
clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py
clang/lib/Tooling/EmptyNodeIntrospection.inc.in
clang/unittests/Introspection/IntrospectionTest.cpp

Removed: 




diff  --git a/clang/include/clang/Tooling/NodeIntrospection.h 
b/clang/include/clang/Tooling/NodeIntrospection.h
index 7e0d5e8d14f5..91552cad2eca 100644
--- a/clang/include/clang/Tooling/NodeIntrospection.h
+++ b/clang/include/clang/Tooling/NodeIntrospection.h
@@ -26,6 +26,7 @@ class CXXCtorInitializer;
 class NestedNameSpecifierLoc;
 class TemplateArgumentLoc;
 class CXXBaseSpecifier;
+struct DeclarationNameInfo;
 
 namespace tooling {
 
@@ -92,6 +93,7 @@ NodeLocationAccessors 
GetLocations(clang::NestedNameSpecifierLoc const &);
 NodeLocationAccessors GetLocations(clang::TemplateArgumentLoc const &);
 NodeLocationAccessors GetLocations(clang::CXXBaseSpecifier const *);
 NodeLocationAccessors GetLocations(clang::TypeLoc const &);
+NodeLocationAccessors GetLocations(clang::DeclarationNameInfo const &);
 NodeLocationAccessors GetLocations(clang::DynTypedNode const &Node);
 } // namespace NodeIntrospection
 } // namespace tooling

diff  --git a/clang/lib/Tooling/DumpTool/APIData.h 
b/clang/lib/Tooling/DumpTool/APIData.h
index ada19d6f1e46..03e247a8bd95 100644
--- a/clang/lib/Tooling/DumpTool/APIData.h
+++ b/clang/lib/Tooling/DumpTool/APIData.h
@@ -22,7 +22,7 @@ struct ClassData {
   std::vector TypeSourceInfos;
   std::vector TypeLocs;
   std::vector NestedNameLocs;
-  // TODO: Extend this with locations available via typelocs etc.
+  std::vector DeclNameInfos;
 };
 
 } // namespace tooling

diff  --git a/clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp 
b/clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp
index dcad05745eca..0aeb3a7703f7 100644
--- a/clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp
+++ b/clang/lib/Tooling/DumpTool/ASTSrcLocProcessor.cpp
@@ -23,19 +23,18 @@ ASTSrcLocProcessor::ASTSrcLocProcessor(StringRef JsonPath)
 
   Finder = std::make_unique(std::move(FinderOptions));
   Finder->addMatcher(
-  cxxRecordDecl(
-  isDefinition(),
-  isSameOrDerivedFrom(
-  // TODO: Extend this with other clades
-  namedDecl(hasAnyName("clang::Stmt", "clang::Decl",
-   "clang::CXXCtorInitializer",
-   "clang::NestedNameSpecifierLoc",
-   "clang::TemplateArgumentLoc",
-   "clang::CXXBaseSpecifier",
-   "clang::TypeLoc"))
-  .bind("nodeClade")),
-  optionally(isDerivedFrom(cxxRecordDecl().bind("derivedFrom"
-  .bind("className"),
+  cxxRecordDecl(
+  isDefinition(),
+  isSameOrDerivedFrom(
+  namedDecl(
+  hasAnyName(
+  "clang::Stmt", "clang::Decl", 
"clang::CXXCtorInitializer",
+  "clang::NestedNameSpecifierLoc",
+  "clang::TemplateArgumentLoc", "clang::CXXBaseSpecifier",
+  "clang::DeclarationNameInfo", "clang::TypeLoc"))
+  .bind("nodeClade")),
+  optionally(isDerivedFrom(cxxRecordDecl().bind("derivedFrom"
+  .bind("className"),
   this);
   Finder->addMatcher(
   cxxRecordDecl(isDefinition(), hasAnyName("clang::PointerLikeTypeLoc",
@@ -85,6 +84,8 @@ llvm::json::Object toJSON(ClassData const &Obj) {
 JsonObj["typeLocs"] = Obj.TypeLocs;
   if (!Obj.NestedNameLocs.empty())
 JsonObj["nestedNameLocs"] = Obj.NestedNameLocs;
+  if (!Obj.DeclNameInfos.empty())
+JsonObj["declNameInfos"] = Obj.DeclNameInfos;
   return JsonObj;
 }
 
@@ -222,6 +223,8 @@ void ASTSrcLocProcessor::run(const MatchFinder::MatchResult 
&Result) {
   CD.TypeLocs = CaptureMethods("class clang::TypeLoc", ASTClass, Result);
   CD.NestedNameLocs =
   CaptureMethods("class clang::NestedNameSpecifierLoc", ASTClass, Result);
+  CD.DeclNameInfos =
+  CaptureMethods("struct clang::DeclarationNameInfo", ASTClass, Result);
 
   if (const auto *DerivedFrom =
   Result.Nodes.getNodeAs("derivedFrom")) {

diff  --git a/clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py 
b/clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py
index 9479

[PATCH] D100658: [RISCV] Apply clang_builtin_alias to overloaded builtins.

2021-04-25 Thread Hsiangkai Wang via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd8fa5ef6a297: [RISCV] Apply clang_builtin_alias to 
overloaded builtins. (authored by HsiangKai).

Changed prior to commit:
  https://reviews.llvm.org/D100658?vs=339607&id=340347#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100658/new/

https://reviews.llvm.org/D100658

Files:
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vaadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vadc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoand.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamomax.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamomin.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoor.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoswap.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoxor.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vand.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vasub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vdiv.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfclass.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfcvt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfdiv.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfirst.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmacc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmax.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmerge.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmin.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmsac.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmsub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmul.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfmv.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfncvt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfnmacc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfnmadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfnmsac.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfnmsub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfrdiv.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfrec7.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfredmax.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfredmin.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfredsum.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfrsqrt7.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfrsub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfsgnj.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfslide1down.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfslide1up.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfsqrt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfsub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwcvt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwmacc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwmsac.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwmul.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwnmacc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwnmsac.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwredsum.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vfwsub.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vid.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/viota.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vle.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vloxei.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vlse.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vluxei.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmacc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmadc.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmadd.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmand.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmax.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmerge.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmfeq.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmfge.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmfgt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmfle.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmflt.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmfne.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmin.c
  clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vmna

[PATCH] D101236: [ASTImporter] Import definitions required for layout of [[no_unique_address]] from LLDB

2021-04-25 Thread Jan Kratochvil via Phabricator via cfe-commits
jankratochvil updated this revision to Diff 340340.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101236/new/

https://reviews.llvm.org/D101236

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp


Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -6323,6 +6323,33 @@
 ToD->getTemplateSpecializationKind());
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportNoUniqueAddress) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  struct A {};
+  struct B {
+[[no_unique_address]] A a;
+  };
+  struct C : B {
+char c;
+  } c;
+  )", Lang_CXX20);
+
+  // It does not fail even without the patch!
+  auto *BFromD = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("B")));
+  ASSERT_TRUE(BFromD);
+  auto *BToD = Import(BFromD, Lang_CXX20);
+  EXPECT_TRUE(BToD);
+
+  // It does not fail even without the patch!
+  auto *CFromD = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("C")));
+  ASSERT_TRUE(CFromD);
+  auto *CToD = Import(CFromD, Lang_CXX20);
+  EXPECT_TRUE(CToD);
+}
+
 INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
 DefaultTestValuesForRunOptions, );
 
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -3673,6 +3673,28 @@
   D->getInClassInitStyle()))
 return ToField;
 
+  // FieldDecl::isZeroSize may need to check these.
+  if (const Attr *FromAttr = D->getAttr()) {
+if (auto ToAttrOrErr = Importer.Import(FromAttr))
+  ToField->addAttr(*ToAttrOrErr);
+else
+  return ToAttrOrErr.takeError();
+RecordType *FromRT =
+const_cast(D->getType()->getAs());
+// Is this field a struct? FieldDecl::isZeroSize will need its definition.
+if (FromRT) {
+  RecordDecl *FromRD = FromRT->getDecl();
+  RecordType *ToRT =
+  const_cast(ToField->getType()->getAs());
+  assert(ToRT && "RecordType import has different type");
+  RecordDecl *ToRD = ToRT->getDecl();
+  if (FromRD->isCompleteDefinition() && !ToRD->isCompleteDefinition()) {
+if (Error Err = ImportDefinition(FromRD, ToRD, IDK_Basic))
+  return std::move(Err);
+  }
+}
+  }
+
   ToField->setAccess(D->getAccess());
   ToField->setLexicalDeclContext(LexicalDC);
   if (ToInitializer)
@@ -8445,6 +8467,8 @@
   // Make sure that ImportImpl registered the imported decl.
   assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
 
+  // There may have been NoUniqueAddressAttr for FieldDecl::isZeroSize.
+  ToD->dropAttrs();
   if (FromD->hasAttrs())
 for (const Attr *FromAttr : FromD->getAttrs()) {
   auto ToAttrOrErr = Import(FromAttr);


Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -6323,6 +6323,33 @@
 ToD->getTemplateSpecializationKind());
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportNoUniqueAddress) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  struct A {};
+  struct B {
+[[no_unique_address]] A a;
+  };
+  struct C : B {
+char c;
+  } c;
+  )", Lang_CXX20);
+
+  // It does not fail even without the patch!
+  auto *BFromD = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("B")));
+  ASSERT_TRUE(BFromD);
+  auto *BToD = Import(BFromD, Lang_CXX20);
+  EXPECT_TRUE(BToD);
+
+  // It does not fail even without the patch!
+  auto *CFromD = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("C")));
+  ASSERT_TRUE(CFromD);
+  auto *CToD = Import(CFromD, Lang_CXX20);
+  EXPECT_TRUE(CToD);
+}
+
 INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
 DefaultTestValuesForRunOptions, );
 
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -3673,6 +3673,28 @@
   D->getInClassInitStyle()))
 return ToField;
 
+  // FieldDecl::isZeroSize may need to check these.
+  if (const Attr *FromAttr = D->getAttr()) {
+if (auto ToAttrOrErr = Importer.Import(FromAttr))
+  ToField->addAttr(*ToAttrOrErr);
+else
+  return ToAttrOrErr.takeError();
+RecordType *FromRT =
+const_cast(D->getType()->getAs());
+// Is this field a struct? FieldDecl::isZeroSize will need its definition.
+if (FromRT) {
+  RecordDecl *FromRD = FromRT->getDecl();
+  RecordType *ToRT =
+  const_cast(ToField->getType()->getAs());
+

[PATCH] D101249: [RISCV] [2/2] Add IR intrinsic for Zbm extension

2021-04-25 Thread LevyHsu via Phabricator via cfe-commits
LevyHsu created this revision.
LevyHsu added reviewers: craig.topper, jrtc27, asb, kito-cheng, Jim.
LevyHsu added projects: clang, LLVM.
Herald added subscribers: vkmr, frasercrmck, evandro, luismarques, apazos, 
sameer.abuasal, usaxena95, s.egerton, benna, psnobl, kadircet, jocewei, PkmX, 
arphaman, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, 
shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, mgorny.
LevyHsu requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang-tools-extra.

RV64 ONLY:

  bmator
  bmatxor
  bmatflip


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101249

Files:
  clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
  clang-tools-extra/clangd/index/CanonicalIncludes.cpp
  clang/lib/Headers/CMakeLists.txt
  clang/lib/Headers/riscv_zbm_intrin.h
  clang/lib/Headers/rvintrin.h
  clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c

Index: clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c
===
--- /dev/null
+++ clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -triple riscv32 -fsyntax-only \
+// RUN:   -target-feature +experimental-zbm %s
+// RUN: %clang_cc1 -triple riscv64 -fsyntax-only \
+// RUN:   -target-feature +experimental-zbm %s
+
+#include 
\ No newline at end of file
Index: clang/lib/Headers/rvintrin.h
===
--- /dev/null
+++ clang/lib/Headers/rvintrin.h
@@ -0,0 +1,26 @@
+/*===-- rvintrin.h -===
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===---===
+ */
+
+#ifndef __RVINTRIN_H
+#define __RVINTRIN_H
+
+#define int_xlen_t long
+#define uint_xlen_t unsigned int_xlen_t
+
+#define __DEFAULT_FN_ATTRS \
+  __attribute__((__always_inline__, __artificial__, __nodebug__))
+
+#if defined(__riscv_zbm)
+#include "riscv_zbm_intrin.h"
+#endif
+
+#undef __DEFAULT_FN_ATTRS
+#undef uint_xlen_t
+#undef int_xlen_t
+#endif // __RVINTRIN_H
\ No newline at end of file
Index: clang/lib/Headers/riscv_zbm_intrin.h
===
--- /dev/null
+++ clang/lib/Headers/riscv_zbm_intrin.h
@@ -0,0 +1,44 @@
+/*=== riscv_zbm_intrin.h ---===
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===---===
+ */
+
+#ifndef __RVINTRIN_H
+#error "Never use  directly; include  instead."
+#endif
+
+#ifndef __RISCV_ZBM_INTRIN_H
+#define __RISCV_ZBM_INTRIN_H
+
+#include 
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// Zbe RV64 ONLY
+#if __riscv_xlen == 64
+static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_bmator(int64_t rs1,
+int64_t rs2) {
+  return __builtin_riscv_bmator(rs1, rs2);
+}
+
+static __inline__ int64_t __DEFAULT_FN_ATTRS _rv__bmatxor(int64_t rs1,
+  int64_t rs2) {
+  return __builtin_riscv_bmatxor(rs1, rs2);
+}
+
+static __inline__ int64_t __DEFAULT_FN_ATTRS _rv__bmatflip(int64_t rs1) {
+  return __builtin_riscv_bmatflip(rs1);
+}
+#endif // if __riscv_xlen == 64
+
+#if defined(__cplusplus)
+}
+#endif // if defined(__cplusplus)
+
+#endif // __RISCV_ZBM_INTRIN_H
Index: clang/lib/Headers/CMakeLists.txt
===
--- clang/lib/Headers/CMakeLists.txt
+++ clang/lib/Headers/CMakeLists.txt
@@ -97,6 +97,8 @@
   ptwriteintrin.h
   rdseedintrin.h
   rtmintrin.h
+  rvintrin.h
+  riscv_zbm_intrin.h
   serializeintrin.h
   sgxintrin.h
   s390intrin.h
Index: clang-tools-extra/clangd/index/CanonicalIncludes.cpp
===
--- clang-tools-extra/clangd/index/CanonicalIncludes.cpp
+++ clang-tools-extra/clangd/index/CanonicalIncludes.cpp
@@ -152,6 +152,8 @@
   {"include/prfchwintrin.h", ""},
   {"include/rdseedintrin.h", ""},
   {"include/rtmintrin.h", ""},
+  {"include/rvintrin.h", ""},
+  {"include/riscv_zbm_intrin.h", ""},
   {"include/shaintrin.h", ""},
   {"include/smmintrin.h", ""},
   {"include/stdalign.h", ""},
Index: clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
===
--- clang-tools-extra/clang-include-fixer/find-all-sy

[PATCH] D101248: [RISCV] [1/2] Add IR intrinsic for Zbm extension

2021-04-25 Thread LevyHsu via Phabricator via cfe-commits
LevyHsu created this revision.
LevyHsu added reviewers: craig.topper, kito-cheng, jrtc27, asb, Jim.
LevyHsu added projects: clang, LLVM.
Herald added subscribers: vkmr, frasercrmck, evandro, luismarques, apazos, 
sameer.abuasal, s.egerton, benna, psnobl, jocewei, PkmX, the_o, brucehoult, 
MartinMosbeck, rogfer01, edward-jones, zzheng, shiva0217, niosHD, sabuasal, 
simoncook, johnrusso, rbar, hiraditya.
LevyHsu requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, MaskRay.

RV64 ONLY:

  bmator
  bmatxor
  bmatflip


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D101248

Files:
  clang/include/clang/Basic/BuiltinsRISCV.def
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbm.c
  llvm/include/llvm/IR/IntrinsicsRISCV.td
  llvm/lib/Target/RISCV/RISCVInstrInfoB.td
  llvm/test/CodeGen/RISCV/rv64zbm-intrinsic.ll

Index: llvm/test/CodeGen/RISCV/rv64zbm-intrinsic.ll
===
--- /dev/null
+++ llvm/test/CodeGen/RISCV/rv64zbm-intrinsic.ll
@@ -0,0 +1,53 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv64 -mattr=+experimental-b -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV64IB
+; RUN: llc -mtriple=riscv64 -mattr=+experimental-zbm -verify-machineinstrs < %s \
+; RUN:   | FileCheck %s -check-prefix=RV64IBM
+
+declare i64 @llvm.riscv.bmator.i64(i64 %a, i64 %b)
+
+define i64 @bmator64(i64 %a, i64 %b) nounwind {
+; RV64IB-LABEL: bmator64:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bmator a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBM-LABEL: bmator64:
+; RV64IBM:   # %bb.0:
+; RV64IBM-NEXT:bmator a0, a0, a1
+; RV64IBM-NEXT:ret
+  %tmp = call i64 @llvm.riscv.bmator.i64(i64 %a, i64 %b)
+ ret i64 %tmp
+}
+
+declare i64 @llvm.riscv.bmatxor.i64(i64 %a, i64 %b)
+
+define i64 @bmatxor64(i64 %a, i64 %b) nounwind {
+; RV64IB-LABEL: bmatxor64:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bmatxor a0, a0, a1
+; RV64IB-NEXT:ret
+;
+; RV64IBM-LABEL: bmatxor64:
+; RV64IBM:   # %bb.0:
+; RV64IBM-NEXT:bmatxor a0, a0, a1
+; RV64IBM-NEXT:ret
+  %tmp = call i64 @llvm.riscv.bmatxor.i64(i64 %a, i64 %b)
+ ret i64 %tmp
+}
+
+declare i64 @llvm.riscv.bmatflip.i64(i64 %a)
+
+define i64 @bmatflip64(i64 %a) nounwind {
+; RV64IB-LABEL: bmatflip64:
+; RV64IB:   # %bb.0:
+; RV64IB-NEXT:bmatflip a0, a0
+; RV64IB-NEXT:ret
+;
+; RV64IBM-LABEL: bmatflip64:
+; RV64IBM:   # %bb.0:
+; RV64IBM-NEXT:bmatflip a0, a0
+; RV64IBM-NEXT:ret
+  %tmp = call i64 @llvm.riscv.bmatflip.i64(i64 %a)
+ ret i64 %tmp
+}
Index: llvm/lib/Target/RISCV/RISCVInstrInfoB.td
===
--- llvm/lib/Target/RISCV/RISCVInstrInfoB.td
+++ llvm/lib/Target/RISCV/RISCVInstrInfoB.td
@@ -934,6 +934,12 @@
 def : PatGprGpr;
 } // Predicates = [HasStdExtZbc]
 
+let Predicates = [HasStdExtZbm, IsRV64] in {
+def : PatGprGpr;
+def : PatGprGpr;
+def : PatGpr;
+} // Predicates = [HasStdExtZbm, IsRV64]
+
 let Predicates = [HasStdExtZbr] in {
 def : PatGpr;
 def : PatGpr;
Index: llvm/include/llvm/IR/IntrinsicsRISCV.td
===
--- llvm/include/llvm/IR/IntrinsicsRISCV.td
+++ llvm/include/llvm/IR/IntrinsicsRISCV.td
@@ -89,6 +89,11 @@
   def int_riscv_clmulh : BitManipGPRGPRIntrinsics;
   def int_riscv_clmulr : BitManipGPRGPRIntrinsics;
 
+  // Zbm
+  def int_riscv_bmator   : BitManipGPRGPRIntrinsics;
+  def int_riscv_bmatxor  : BitManipGPRGPRIntrinsics;
+  def int_riscv_bmatflip : BitManipGPRIntrinsics;
+
   // Zbp
   def int_riscv_grev  : BitManipGPRGPRIntrinsics;
   def int_riscv_gorc  : BitManipGPRGPRIntrinsics;
Index: clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbm.c
===
--- /dev/null
+++ clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbm.c
@@ -0,0 +1,45 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-zbm -emit-llvm %s -o - \
+// RUN: | FileCheck %s  -check-prefix=RV64ZBM
+
+// RV64ZBM-LABEL: @clmul(
+// RV64ZBM-NEXT:  entry:
+// RV64ZBM-NEXT:[[A_ADDR:%.*]] = alloca i64, align 8
+// RV64ZBM-NEXT:[[B_ADDR:%.*]] = alloca i64, align 8
+// RV64ZBM-NEXT:store i64 [[A:%.*]], i64* [[A_ADDR]], align 8
+// RV64ZBM-NEXT:store i64 [[B:%.*]], i64* [[B_ADDR]], align 8
+// RV64ZBM-NEXT:[[TMP0:%.*]] = load i64, i64* [[A_ADDR]], align 8
+// RV64ZBM-NEXT:[[TMP1:%.*]] = load i64, i64* [[B_ADDR]], align 8
+// RV64ZBM-NEXT:[[TMP2:%.*]] = call i64 @llvm.riscv.bmator.i64(i64 [[TMP0]], i64 [[TMP1]])
+// RV64ZBM-NEXT:ret i64 [[TMP2]]
+//
+long clmul(long a, long b) {
+  return __builtin_riscv_bmator(a, b);
+}
+
+// RV64ZBM-LABEL: @clmulh(
+// RV64ZBM-NEXT:  entry:
+// RV64ZBM-NEXT:[[A_ADDR:%.*]] = alloca i64, align 8
+// RV64ZBM-NEX

[PATCH] D83660: [analyzer] Fix a crash for dereferencing an empty llvm::Optional variable in SMTConstraintManager.h.

2021-04-25 Thread Ella Ma via Phabricator via cfe-commits
OikawaKirie added a comment.

In D83660#2675064 , @mikhail.ramalho 
wrote:

> Indeed it looks like a copy & paste error, I'm surprised no one found it 
> earlier.
>
> Regarding the tests, we used to have `make check-clang-analysis-z3` (or 
> something similar) that would run only the analyzer's tests, but using Z3 as 
> the constraint solver. It looks like this change broke it: 
> https://reviews.llvm.org/D62445

I add `VERBOSE=1` during execution, and command 
`/path/to/llvm-project/build/./bin/llvm-lit -sv --param USE_Z3_SOLVER=0 
/path/to/llvm-project/clang/test/Analysis/z3` is used to execute lit for 
testing.
And this test case is not executed.

Should the execution requirements be changed to make it run if z3 is enabled? 
Or just keep it as it is now?

If there are no other suggestions for this patch, I'd like to see it landed 
ASAP. I think it is a far too long period for a fix of a copy & paste error.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83660/new/

https://reviews.llvm.org/D83660

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D101194: [Driver] Push multiarch path setup to individual drivers

2021-04-25 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay accepted this revision.
MaskRay added a comment.
This revision is now accepted and ready to land.

In D101194#2714991 , @phosek wrote:

> In D101194#2714206 , @MaskRay wrote:
>
>>> Different platforms use different rules for multiarch triples so it's 
>>> difficult to provide a single method for all platforms.
>>
>> Guess this is a Linux/Hurd/Fuchsia specific thing. I don't know much about 
>> the runtime build but I hope the Linux hierarchy is not set in stone.
>>
>> Can you dump a diff how `addPathIfExists(D, getStdlibPath(), Paths);` and a 
>> similar call will change `-L` paths in the linking stage?
>> You can use `clang ... '-###' |& sed -E 's/ "?-L/\n&/g; s/ "?-[iI]/\n&/g'` 
>> to break -L into multiple lines.
>
> There's no difference, current behavior is already covered by tests and those 
> are still passing. The difference is that `ToolChain::getRuntimePath()` and 
> `ToolChain::getStdlibPath()` currently try various possible spellings of 
> triples whereas with this patch that's no longer needed because each platform 
> controls its own spelling so we save a few syscalls.
>
> I checked and the multiarch runtimes layout is currently only used by 
> Fuchsia, Linux and WebAssembly, other platforms use their own custom logic. 
> If other platforms decide to pickup this layout as well, they can follow the 
> same pattern.

Hope you can dump the current behavior.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101194/new/

https://reviews.llvm.org/D101194

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits