[PATCH] D90009: [X86] VEX/EVEX prefix doesn't work for inline assembly.

2020-10-24 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/D90009/new/

https://reviews.llvm.org/D90009

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


[PATCH] D89998: [c++20] For P0732R2 / P1907R1: Basic code generation and name mangling support for non-type template parameters of class type and template parameter objects.

2020-10-24 Thread Richard Smith - zygoloid via Phabricator via cfe-commits
rsmith updated this revision to Diff 300524.
rsmith added a comment.

- Fix incorrect mangling for zero-but-not-null template arguments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89998

Files:
  clang/include/clang/AST/ASTContext.h
  clang/lib/AST/APValue.cpp
  clang/lib/AST/ASTContext.cpp
  clang/lib/AST/Decl.cpp
  clang/lib/AST/ItaniumMangle.cpp
  clang/lib/AST/Linkage.h
  clang/lib/CodeGen/CGCXXABI.cpp
  clang/lib/CodeGen/CGCXXABI.h
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/lib/CodeGen/ItaniumCXXABI.cpp
  clang/test/CodeGenCXX/mangle-class-nttp.cpp
  clang/test/CodeGenCXX/template-param-objects.cpp

Index: clang/test/CodeGenCXX/template-param-objects.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/template-param-objects.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++20 %s -emit-llvm -o - | FileCheck %s
+
+struct S { char buf[32]; };
+template constexpr const char *begin() { return s.buf; }
+template constexpr const char *end() { return s.buf + __builtin_strlen(s.buf); }
+
+// CHECK: [[HELLO:@_ZTAXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100]] = linkonce_odr constant { <{ [11 x i8], [21 x i8] }> } { <{ [11 x i8], [21 x i8] }> <{ [11 x i8] c"hello world", [21 x i8] zeroinitializer }> }, comdat
+
+// CHECK: @p = global i8* getelementptr inbounds ({{.*}}* [[HELLO]], i32 0, i32 0, i32 0, i32 0)
+const char *p = begin();
+// CHECK: @q = global i8* getelementptr (i8, i8* getelementptr inbounds ({{.*}}* [[HELLO]], i32 0, i32 0, i32 0, i32 0), i64 11)
+const char *q = end();
Index: clang/test/CodeGenCXX/mangle-class-nttp.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/mangle-class-nttp.cpp
@@ -0,0 +1,165 @@
+// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s
+
+#define fold(x) (__builtin_constant_p(x) ? (x) : (x))
+
+struct A { int a, b; };
+template void f() {}
+
+// CHECK: define weak_odr void @_Z1fIXtl1ALi1ELi2vv(
+template void f();
+
+struct B { int *p; int k; };
+template void f() {}
+
+int n = 0;
+// CHECK: define weak_odr void @_Z1fIXtl1BadL_Z1nvv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BLPi0ELi1vv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BEEEvv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BLPi32vv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BrcPiLi0vv(
+template void f(0))}>();
+
+// Pointers to subobjects.
+struct Nested { union { int k; int arr[2]; }; } nested[2];
+struct Derived : A, Nested {} derived;
+// CHECK: define weak_odr void @_Z1fIXtl1BadsoiL_Z6nestedE_vv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BadsoiL_Z6nestedE16_0pvv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BadsoiL_Z7derivedE8pvv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1BcvPiplcvPcadL_Z7derivedELl16vv
+template void f();
+
+// References to subobjects.
+struct BR { int  };
+template void f() {}
+// CHECK: define weak_odr void @_Z1fIXtl2BRsoiL_Z6nestedE_vv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl2BRsoiL_Z6nestedE12_0vv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl2BRsoiL_Z7derivedE4vv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl2BRdecvPiplcvPcadL_Z7derivedELl16vv
+template void f();
+
+// Qualification conversions.
+struct C { const int *p; };
+template void f() {}
+// CHECK: define weak_odr void @_Z1fIXtl1CadsoKiL_Z7derivedE4vv
+template void f();
+
+// Pointers to members.
+struct D { const int Derived::*p; int k; };
+template void f() {}
+// CHECK: define weak_odr void @_Z1fIXtl1DLM7DerivedKi0ELi1vv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1DEEEvv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN1A1aEEvv
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN1A1bEEvv
+template void f();
+// FIXME: Is the Ut_1 mangling here correct?
+// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN6NestedUt_1kEE8vv
+template void f();
+struct MoreDerived : A, Derived { int z; };
+// CHECK: define weak_odr void @_Z1fIXtl1DmcM7DerivedKiadL_ZN11MoreDerived1zEEn8vv
+template void f();
+
+union E {
+  int n;
+  float f;
+  constexpr E() {}
+  constexpr E(int n) : n(n) {}
+  constexpr E(float f) : f(f) {}
+};
+template void f() {}
+
+// Union members.
+// CHECK: define weak_odr void @_Z1fIXL1vv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1vv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1Edi1nLi42vv(
+template void f();
+// CHECK: define weak_odr void @_Z1fIXtl1Edi1fLfvv(
+template void f();
+
+// Extensions, and dropping 

[clang] 7b35158 - For P0732R2, P1907R1: ensure that template parameter objects don't refer

2020-10-24 Thread Richard Smith via cfe-commits

Author: Richard Smith
Date: 2020-10-24T22:11:43-07:00
New Revision: 7b3515880c22c887cd5ca4825dfb060ad82d3ebc

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

LOG: For P0732R2, P1907R1: ensure that template parameter objects don't refer
to disallowed objects or have non-constant destruction.

Added: 


Modified: 
clang/include/clang/AST/Expr.h
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/include/clang/Basic/LLVM.h
clang/include/clang/Basic/PartialDiagnostic.h
clang/lib/AST/ExprConstant.cpp
clang/lib/Sema/SemaChecking.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/SemaOverload.cpp
clang/test/CXX/drs/dr1xx.cpp
clang/test/CXX/temp/temp.param/p8-cxx20.cpp
clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp

Removed: 




diff  --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 25957909739e..11b05ce7a5f5 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -711,13 +711,26 @@ class Expr : public ValueStmt {
 ArrayRef Args,
 const Expr *This = nullptr) const;
 
-  /// Indicates how the constant expression will be used.
-  enum ConstExprUsage { EvaluateForCodeGen, EvaluateForMangling };
+  enum class ConstantExprKind {
+/// An integer constant expression (an array bound, enumerator, case value,
+/// bit-field width, or similar) or similar.
+Normal,
+/// A non-class template argument. Such a value is only used for mangling,
+/// not for code generation, so can refer to dllimported functions.
+NonClassTemplateArgument,
+/// A class template argument. Such a value is used for code generation.
+ClassTemplateArgument,
+/// An immediate invocation. The destruction of the end result of this
+/// evaluation is not part of the evaluation, but all other temporaries
+/// are destroyed.
+ImmediateInvocation,
+  };
 
-  /// Evaluate an expression that is required to be a constant expression.
-  bool EvaluateAsConstantExpr(EvalResult , ConstExprUsage Usage,
-  const ASTContext ,
-  bool InPlace = false) const;
+  /// Evaluate an expression that is required to be a constant expression. Does
+  /// not check the syntactic constraints for C and C++98 constant expressions.
+  bool EvaluateAsConstantExpr(
+  EvalResult , const ASTContext ,
+  ConstantExprKind Kind = ConstantExprKind::Normal) const;
 
   /// If the current Expr is a pointer, this will try to statically
   /// determine the number of bytes available where the pointer is pointing.
@@ -971,6 +984,8 @@ static_assert(llvm::PointerLikeTypeTraits::NumLowBitsAvailable <=
   llvm::detail::ConstantLog2::value,
   "PointerLikeTypeTraits assumes too much alignment.");
 
+using ConstantExprKind = Expr::ConstantExprKind;
+
 
//===--===//
 // Wrapper Expressions.
 
//===--===//
@@ -1997,6 +2012,10 @@ class PredefinedExpr final
   }
 
   static StringRef getIdentKindName(IdentKind IK);
+  StringRef getIdentKindName() const {
+return getIdentKindName(getIdentKind());
+  }
+
   static std::string ComputeName(IdentKind IK, const Decl *CurrentDecl);
 
   SourceLocation getBeginLoc() const { return getLocation(); }

diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 65e3755efd22..a4f96a97991e 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -234,6 +234,12 @@ def err_seh___finally_block : Error<
 // Sema && AST
 def note_invalid_subexpr_in_const_expr : Note<
   "subexpression not valid in a constant expression">;
+def note_constexpr_invalid_template_arg : Note<
+  "%select{pointer|reference}0 to %select{|subobject of }1"
+  "%select{type_info object|string literal|temporary object|"
+  "predefined '%3' variable}2 is not allowed in a template argument">;
+def err_constexpr_invalid_template_arg : Error<
+  note_constexpr_invalid_template_arg.Text>;
 
 // Sema && Frontend
 let CategoryName = "Inline Assembly Issue" in {

diff  --git a/clang/include/clang/Basic/LLVM.h 
b/clang/include/clang/Basic/LLVM.h
index e9bb96af972e..02e422051071 100644
--- a/clang/include/clang/Basic/LLVM.h
+++ b/clang/include/clang/Basic/LLVM.h
@@ -54,6 +54,7 @@ namespace llvm {
 namespace clang {
   // Casting operators.
   using llvm::isa;
+  using llvm::isa_and_nonnull;
   using llvm::cast;
   using llvm::dyn_cast;
   using 

[PATCH] D89670: [clangd] Store the containing symbol for refs

2020-10-24 Thread Nathan Ridge via Phabricator via cfe-commits
nridge marked an inline comment as done.
nridge added inline comments.



Comment at: clang-tools-extra/clangd/index/SymbolCollector.cpp:349
+SymbolRef{SM.getFileLoc(Loc), Roles,
+  dyn_cast_or_null(ASTNode.Parent)});
   // Don't continue indexing if this is a mere reference.

kadircet wrote:
> What does `ASTNode.Parent` correspond to in here? I couldn't find any 
> clarifications on libIndex side, are we sure that's always what we want? It 
> would be nice to have some tests demonstrating what this corresponds to in a 
> variety of cases.
> 
> Also why do we only store `NamedDecl`s as containers? It makes sense from 
> CallHierarchy perspective as we are only interested in function-like 
> containers, and they are nameddecls (?). But these might as well be 
> `TranslationUnitDecl` (?) for top level declarations,
I wrote a test with various cases I could think of, and the choice of decl 
coming from `ASTNode.Parent` seems reasonable to me.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89670

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


[PATCH] D89670: [clangd] Store the containing symbol for refs

2020-10-24 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 300518.
nridge added a comment.

Use Decl rather than NamedDecl, and add a test


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89670

Files:
  clang-tools-extra/clangd/index/Ref.h
  clang-tools-extra/clangd/index/Serialization.cpp
  clang-tools-extra/clangd/index/SymbolCollector.cpp
  clang-tools-extra/clangd/index/SymbolCollector.h
  clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp

Index: clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
===
--- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
+++ clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
@@ -70,21 +70,16 @@
 MATCHER_P2(IncludeHeaderWithRef, IncludeHeader, References, "") {
   return (arg.IncludeHeader == IncludeHeader) && (arg.References == References);
 }
+bool rangesMatch(const SymbolLocation , const Range ) {
+  return std::make_tuple(Loc.Start.line(), Loc.Start.column(), Loc.End.line(),
+ Loc.End.column()) ==
+ std::make_tuple(R.start.line, R.start.character, R.end.line,
+ R.end.character);
+}
 MATCHER_P(DeclRange, Pos, "") {
-  return std::make_tuple(arg.CanonicalDeclaration.Start.line(),
- arg.CanonicalDeclaration.Start.column(),
- arg.CanonicalDeclaration.End.line(),
- arg.CanonicalDeclaration.End.column()) ==
- std::make_tuple(Pos.start.line, Pos.start.character, Pos.end.line,
- Pos.end.character);
-}
-MATCHER_P(DefRange, Pos, "") {
-  return std::make_tuple(
- arg.Definition.Start.line(), arg.Definition.Start.column(),
- arg.Definition.End.line(), arg.Definition.End.column()) ==
- std::make_tuple(Pos.start.line, Pos.start.character, Pos.end.line,
- Pos.end.character);
+  return rangesMatch(arg.CanonicalDeclaration, Pos);
 }
+MATCHER_P(DefRange, Pos, "") { return rangesMatch(arg.Definition, Pos); }
 MATCHER_P(RefCount, R, "") { return int(arg.References) == R; }
 MATCHER_P(ForCodeCompletion, IsIndexedForCodeCompletion, "") {
   return static_cast(arg.Flags & Symbol::IndexedForCodeCompletion) ==
@@ -100,10 +95,7 @@
 MATCHER(RefRange, "") {
   const Ref  = ::testing::get<0>(arg);
   const Range  = ::testing::get<1>(arg);
-  return std::make_tuple(Pos.Location.Start.line(), Pos.Location.Start.column(),
- Pos.Location.End.line(), Pos.Location.End.column()) ==
- std::make_tuple(Range.start.line, Range.start.character,
- Range.end.line, Range.end.character);
+  return rangesMatch(Pos.Location, Range);
 }
 ::testing::Matcher &>
 HaveRanges(const std::vector Ranges) {
@@ -738,6 +730,54 @@
   EXPECT_THAT(Refs, Not(Contains(Pair(findSymbol(Symbols, "FUNC").ID, _;
 }
 
+TEST_F(SymbolCollectorTest, RefContainers) {
+  Annotations Code(R"cpp(
+int f1(int);
+void f2() {
+  (void) $ref1a[[f1]](1);
+  auto fptr = &$ref1b[[f1]];
+}
+int v1 = $ref2[[f1]](2);
+void f3(int arg = $ref3[[f1]](3));
+struct S1 {
+  int member = $ref4[[f1]](4);
+};
+constexpr int f4(int x) { return x + 1; }
+template  struct S2 {};
+S2<$ref6[[f4]](0)> v2;
+S2<$ref7a[[f4]](0)> f5(S2<$ref7b[[f4]](0)>);
+  )cpp");
+  CollectorOpts.RefFilter = RefKind::All;
+  CollectorOpts.CollectMainFileRefs = true;
+  runSymbolCollector("", Code.code());
+  auto FindRefWithRange = [&](Range R) -> Optional {
+for (auto  : Refs) {
+  for (auto  : Entry.second) {
+if (rangesMatch(Ref.Location, R))
+  return Ref;
+  }
+}
+return llvm::None;
+  };
+  auto AssertContainer = [&](llvm::StringRef RefAnnotation,
+ llvm::StringRef ExpectedContainerName) {
+auto Ref = FindRefWithRange(Code.range(RefAnnotation));
+EXPECT_TRUE(bool(Ref));
+
+auto ExpectedContainer = findSymbol(Symbols, ExpectedContainerName);
+EXPECT_EQ(Ref->Container, ExpectedContainer.ID);
+  };
+  AssertContainer("ref1a", "f2");// function body (call)
+  AssertContainer("ref1b", "f2");// function body (address-of)
+  AssertContainer("ref2", "v1"); // variable initializer
+  AssertContainer("ref3", "f3"); // function parameter default value
+  AssertContainer("ref4", "S1::member"); // member initializer
+  AssertContainer("ref5", "S2"); // template parameter default value
+  AssertContainer("ref6", "v2"); // type of variable
+  AssertContainer("ref7a", "f5");// return type of function
+  AssertContainer("ref7b", "f5");// parameter type of function
+}
+
 TEST_F(SymbolCollectorTest, MacroRefInHeader) {
   Annotations Header(R"(
   #define $foo[[FOO]](X) (X + 1)
Index: clang-tools-extra/clangd/index/SymbolCollector.h

[PATCH] D90101: [Clang][OpenMP][WIP] Avoid unnecessary privatization of mapper array when there is no user defined mapper

2020-10-24 Thread Shilei Tian via Phabricator via cfe-commits
tianshilei1992 updated this revision to Diff 300517.
tianshilei1992 added a comment.

Fixed some test cases


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90101

Files:
  clang/lib/CodeGen/CGOpenMPRuntime.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp
  clang/test/OpenMP/target_codegen.cpp
  clang/test/OpenMP/target_enter_data_depend_codegen.cpp
  clang/test/OpenMP/target_exit_data_depend_codegen.cpp
  clang/test/OpenMP/target_parallel_depend_codegen.cpp
  clang/test/OpenMP/target_parallel_for_codegen.cpp
  clang/test/OpenMP/target_parallel_for_depend_codegen.cpp
  clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp
  clang/test/OpenMP/target_simd_depend_codegen.cpp
  clang/test/OpenMP/target_teams_codegen.cpp
  clang/test/OpenMP/target_teams_depend_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_simd_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp
  clang/test/OpenMP/target_update_depend_codegen.cpp

Index: clang/test/OpenMP/target_update_depend_codegen.cpp
===
--- clang/test/OpenMP/target_update_depend_codegen.cpp
+++ clang/test/OpenMP/target_update_depend_codegen.cpp
@@ -64,7 +64,7 @@
   // CK1: store i32 [[DEVICE]], i32* [[CAP_DEVICE]],
   // CK1: [[DEV1:%.+]] = load i32, i32* %{{.+}}
   // CK1: [[DEV2:%.+]] = sext i32 [[DEV1]] to i64
-  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_target_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{72|40}}, i[[sz]] 4, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* [[TASK_ENTRY0:@.+]] to i32 (i32, i8*)*), i64 [[DEV2]])
+  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_target_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{64|36}}, i[[sz]] 4, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* [[TASK_ENTRY0:@.+]] to i32 (i32, i8*)*), i64 [[DEV2]])
   // CK1: [[BC:%.+]] = bitcast i8* [[RES]] to %struct.kmp_task_t_with_privates*
   // CK1: [[TASK_T:%.+]] = getelementptr inbounds %struct.kmp_task_t_with_privates, %struct.kmp_task_t_with_privates* [[BC]], i32 0, i32 0
   // CK1: [[SHAREDS:%.+]] = getelementptr inbounds %struct.kmp_task_t, %struct.kmp_task_t* [[TASK_T]], i32 0, i32 0
@@ -130,7 +130,7 @@
   // CK1: [[IF_BOOL:%.+]] = trunc i8 [[IF]] to i1
   // CK1: [[IF:%.+]] = zext i1 [[IF_BOOL]] to i8
   // CK1: store i8 [[IF]], i8* [[IF_DEVICE]],
-  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{72|40}}, i[[sz]] 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates{{.+}}*)* [[TASK_ENTRY2:@.+]] to i32 (i32, i8*)*))
+  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{64|36}}, i[[sz]] 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates{{.+}}*)* [[TASK_ENTRY2:@.+]] to i32 (i32, i8*)*))
   // CK1: [[RES_BC:%.+]] = bitcast i8* [[RES]] to %struct.kmp_task_t_with_privates{{.+}}*
   // CK1: [[TASK_T:%.+]] = getelementptr inbounds %struct.kmp_task_t_with_privates{{.+}}, %struct.kmp_task_t_with_privates{{.+}}* [[RES_BC]], i32 0, i32 0
   // CK1: [[SHAREDS:%.+]] = getelementptr inbounds %struct.kmp_task_t, %struct.kmp_task_t* [[TASK_T]], i32 0, i32 0
@@ -213,7 +213,7 @@
   // CK1: [[GEPBP0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BP]], i32 0, i32 0
   // CK1: [[GEPP0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[P]], i32 0, i32 0
   // CK1: [[GEPS0:%.+]] = getelementptr inbounds [1 x i64], [1 x i64]* [[S]], i32 0, i32 0
-  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{72|40}}, i[[sz]] 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates{{.+}}*)* [[TASK_ENTRY3:@.+]] to i32 (i32, i8*)*))
+  // CK1: [[RES:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i[[sz]] {{64|36}}, i[[sz]] 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates{{.+}}*)* [[TASK_ENTRY3:@.+]] to i32 (i32, i8*)*))
   // CK1: [[RES_BC:%.+]] = bitcast i8* [[RES]] to %struct.kmp_task_t_with_privates{{.+}}*
   // CK1: [[TASK_T:%.+]] = getelementptr inbounds %struct.kmp_task_t_with_privates{{.+}}, %struct.kmp_task_t_with_privates{{.+}}* [[RES_BC]], i32 0, i32 0
   // CK1: [[PRIVS:%.+]] = getelementptr inbounds %struct.kmp_task_t_with_privates{{.+}}, %struct.kmp_task_t_with_privates{{.+}}* [[RES_BC]], i32 0, i32 1
@@ -298,7 +298,7 @@
   // CK1: store double* %{{.+}}, double** [[P1_BC]],
   // CK1: [[GEPBP0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BP]], i32 0, i32 0
   // 

[PATCH] D54943: WIP [clang-tidy] implement const-transformation for cppcoreguidelines-const-correctness

2020-10-24 Thread Florin Iucha via Phabricator via cfe-commits
0x8000- added a comment.

Would it be possible to split this review further, into "checking" and "fixing" 
portions? I understand that fix-it portion is more difficult, and sometimes 
results in multiple 'const' keywords being added, but for the past year we have 
used the check as part of regular CI runs to flag where it needs to be added by 
the engineers and for our use case it works fine that way - so I would prefer 
to have at least the "report" part as part of upstream Clang12, even if the 
'fixup' comes later, due to the complexity of covering all corner cases.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D54943

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


[PATCH] D90110: Use --use-color in run-clang-tidy.py

2020-10-24 Thread David Sanders via Phabricator via cfe-commits
dsanders11 created this revision.
dsanders11 added a reviewer: alexfh.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
dsanders11 requested review of this revision.

Now that D79477  landed, it's a better user 
experience to use '--use-color' in run-clang-tidy.py and preserving the colored 
output.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D90110

Files:
  clang-tools-extra/clang-tidy/tool/run-clang-tidy.py


Index: clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
===
--- clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
+++ clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
@@ -83,7 +83,7 @@
 header_filter, allow_enabling_alpha_checkers,
 extra_arg, extra_arg_before, quiet, config):
   """Gets a command line for clang-tidy."""
-  start = [clang_tidy_binary]
+  start = [clang_tidy_binary, '--use-color']
   if allow_enabling_alpha_checkers:
 start.append('-allow-enabling-analyzer-alpha-checkers')
   if header_filter is not None:


Index: clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
===
--- clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
+++ clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
@@ -83,7 +83,7 @@
 header_filter, allow_enabling_alpha_checkers,
 extra_arg, extra_arg_before, quiet, config):
   """Gets a command line for clang-tidy."""
-  start = [clang_tidy_binary]
+  start = [clang_tidy_binary, '--use-color']
   if allow_enabling_alpha_checkers:
 start.append('-allow-enabling-analyzer-alpha-checkers')
   if header_filter is not None:
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D90109: [clang-tidy] Use ANSI escape codes for --use-color on Windows

2020-10-24 Thread David Sanders via Phabricator via cfe-commits
dsanders11 added a comment.

Added a few inline comments for clarification.

**Note**: I was not able to get a debug build and unit tests working on my 
Windows set up, so this has only been tested manually. I'm not sure if the unit 
test added in D79477  runs on Windows, but  in 
theory it should be broken on Windows since it expects ANSI escape codes in the 
output.




Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:113
 DiagPrinter->BeginSourceFile(LangOpts);
+#if defined(_WIN32)
+if (DiagOpts->ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) 
{

To prevent any unintended changes this has been confined to only Windows, but 
the code should be safe to run on any platform. I believe it would be a no-op 
on Unix, which always uses ANSI escape codes and UseANSIEscapeCodes is a no-op.



Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:114
+#if defined(_WIN32)
+if (DiagOpts->ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) 
{
+  llvm::sys::Process::UseANSIEscapeCodes(true);

Limited to only non-displayed standard out so that using '--use-color' from a 
console will be a no-op, rather than turning on ANSI escape codes and making it 
act differently than a default invocation which has color on by default.



Comment at: llvm/lib/Support/Windows/Process.inc:330
 DWORD Mode;
-GetConsoleMode(Console, );
-Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
-SetConsoleMode(Console, Mode);
+if (GetConsoleMode(Console, ) != 0) {
+  Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;

Fixes a crash when calling UseANSIEscapeCodes if standard out isn't a console.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90109

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


[PATCH] D90109: [clang-tidy] Use ANSI escape codes for --use-color on Windows

2020-10-24 Thread David Sanders via Phabricator via cfe-commits
dsanders11 created this revision.
dsanders11 added reviewers: aaron.ballman, njames93.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya, xazax.hun.
Herald added projects: clang, LLVM.
dsanders11 requested review of this revision.

On Windows the --use-color option cannot be used for its originally intended 
purpose of forcing color when piping stdout, since Windows does not use ANSI 
escape codes by default. This change turns on ANSI escape codes on Windows when 
forcing color to a non-displayed stdout (e.g. piped).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D90109

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  llvm/lib/Support/Windows/Process.inc


Index: llvm/lib/Support/Windows/Process.inc
===
--- llvm/lib/Support/Windows/Process.inc
+++ llvm/lib/Support/Windows/Process.inc
@@ -327,9 +327,10 @@
   if (enable) {
 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
 DWORD Mode;
-GetConsoleMode(Console, );
-Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
-SetConsoleMode(Console, Mode);
+if (GetConsoleMode(Console, ) != 0) {
+  Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+  SetConsoleMode(Console, Mode);
+}
   }
 #endif
   UseANSI = enable;
Index: clang-tools-extra/clang-tidy/ClangTidy.cpp
===
--- clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -110,6 +110,11 @@
 DiagOpts->ShowColors = Context.getOptions().UseColor.getValueOr(
 llvm::sys::Process::StandardOutHasColors());
 DiagPrinter->BeginSourceFile(LangOpts);
+#if defined(_WIN32)
+if (DiagOpts->ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) 
{
+  llvm::sys::Process::UseANSIEscapeCodes(true);
+}
+#endif
   }
 
   SourceManager () { return SourceMgr; }


Index: llvm/lib/Support/Windows/Process.inc
===
--- llvm/lib/Support/Windows/Process.inc
+++ llvm/lib/Support/Windows/Process.inc
@@ -327,9 +327,10 @@
   if (enable) {
 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
 DWORD Mode;
-GetConsoleMode(Console, );
-Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
-SetConsoleMode(Console, Mode);
+if (GetConsoleMode(Console, ) != 0) {
+  Mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+  SetConsoleMode(Console, Mode);
+}
   }
 #endif
   UseANSI = enable;
Index: clang-tools-extra/clang-tidy/ClangTidy.cpp
===
--- clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -110,6 +110,11 @@
 DiagOpts->ShowColors = Context.getOptions().UseColor.getValueOr(
 llvm::sys::Process::StandardOutHasColors());
 DiagPrinter->BeginSourceFile(LangOpts);
+#if defined(_WIN32)
+if (DiagOpts->ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) {
+  llvm::sys::Process::UseANSIEscapeCodes(true);
+}
+#endif
   }
 
   SourceManager () { return SourceMgr; }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] aaa8b44 - [clangd] Add a TestWorkspace utility

2020-10-24 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2020-10-24T20:15:17-04:00
New Revision: aaa8b44d19918ea1764339224cec68c27445aa8e

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

LOG: [clangd] Add a TestWorkspace utility

TestWorkspace allows easily writing tests involving multiple
files that can have inclusion relationships between them.

BackgroundIndexTest.RelationsMultiFile is refactored to use
TestWorkspace, and moved to FileIndexTest as it no longer
depends on BackgroundIndex.

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

Added: 
clang-tools-extra/clangd/unittests/TestWorkspace.cpp
clang-tools-extra/clangd/unittests/TestWorkspace.h

Modified: 
clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
clang-tools-extra/clangd/unittests/CMakeLists.txt
clang-tools-extra/clangd/unittests/FileIndexTests.cpp
clang-tools-extra/clangd/unittests/TestTU.cpp
clang-tools-extra/clangd/unittests/TestTU.h
llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp 
b/clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
index cc0ca6f54a7f..b25d3fde0002 100644
--- a/clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
+++ b/clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
@@ -230,49 +230,6 @@ TEST_F(BackgroundIndexTest, IndexTwoFiles) {
FileURI("unittest:///root/B.cc")}));
 }
 
-TEST_F(BackgroundIndexTest, RelationsMultiFile) {
-  MockFS FS;
-  FS.Files[testPath("root/Base.h")] = "class Base {};";
-  FS.Files[testPath("root/A.cc")] = R"cpp(
-#include "Base.h"
-class A : public Base {};
-  )cpp";
-  FS.Files[testPath("root/B.cc")] = R"cpp(
-#include "Base.h"
-class B : public Base {};
-  )cpp";
-
-  llvm::StringMap Storage;
-  size_t CacheHits = 0;
-  MemoryShardStorage MSS(Storage, CacheHits);
-  OverlayCDB CDB(/*Base=*/nullptr);
-  BackgroundIndex Index(FS, CDB, [&](llvm::StringRef) { return  },
-/*Opts=*/{});
-
-  tooling::CompileCommand Cmd;
-  Cmd.Filename = testPath("root/A.cc");
-  Cmd.Directory = testPath("root");
-  Cmd.CommandLine = {"clang++", Cmd.Filename};
-  CDB.setCompileCommand(testPath("root/A.cc"), Cmd);
-  ASSERT_TRUE(Index.blockUntilIdleForTest());
-
-  Cmd.Filename = testPath("root/B.cc");
-  Cmd.CommandLine = {"clang++", Cmd.Filename};
-  CDB.setCompileCommand(testPath("root/B.cc"), Cmd);
-  ASSERT_TRUE(Index.blockUntilIdleForTest());
-
-  auto HeaderShard = MSS.loadShard(testPath("root/Base.h"));
-  EXPECT_NE(HeaderShard, nullptr);
-  SymbolID Base = findSymbol(*HeaderShard->Symbols, "Base").ID;
-
-  RelationsRequest Req;
-  Req.Subjects.insert(Base);
-  Req.Predicate = RelationKind::BaseOf;
-  uint32_t Results = 0;
-  Index.relations(Req, [&](const SymbolID &, const Symbol &) { ++Results; });
-  EXPECT_EQ(Results, 2u);
-}
-
 TEST_F(BackgroundIndexTest, MainFileRefs) {
   MockFS FS;
   FS.Files[testPath("root/A.h")] = R"cpp(

diff  --git a/clang-tools-extra/clangd/unittests/CMakeLists.txt 
b/clang-tools-extra/clangd/unittests/CMakeLists.txt
index de8eaca6059f..bf964484bc6c 100644
--- a/clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ b/clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -88,6 +88,7 @@ add_unittest(ClangdUnitTests ClangdTests
   TestFS.cpp
   TestIndex.cpp
   TestTU.cpp
+  TestWorkspace.cpp
   TypeHierarchyTests.cpp
   TweakTests.cpp
   TweakTesting.cpp

diff  --git a/clang-tools-extra/clangd/unittests/FileIndexTests.cpp 
b/clang-tools-extra/clangd/unittests/FileIndexTests.cpp
index 4abe0bf5e5dc..80c4798fc65b 100644
--- a/clang-tools-extra/clangd/unittests/FileIndexTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FileIndexTests.cpp
@@ -14,6 +14,7 @@
 #include "SyncAPI.h"
 #include "TestFS.h"
 #include "TestTU.h"
+#include "TestWorkspace.h"
 #include "URI.h"
 #include "index/CanonicalIncludes.h"
 #include "index/FileIndex.h"
@@ -426,6 +427,33 @@ TEST(FileIndexTest, Relations) {
   EXPECT_EQ(Results, 1u);
 }
 
+TEST(FileIndexTest, RelationsMultiFile) {
+  TestWorkspace Workspace;
+  Workspace.addSource("Base.h", "class Base {};");
+  Workspace.addMainFile("A.cpp", R"cpp(
+#include "Base.h"
+class A : public Base {};
+  )cpp");
+  Workspace.addMainFile("B.cpp", R"cpp(
+#include "Base.h"
+class B : public Base {};
+  )cpp");
+
+  auto Index = Workspace.index();
+  FuzzyFindRequest FFReq;
+  FFReq.Query = "Base";
+  FFReq.AnyScope = true;
+  SymbolID Base;
+  Index->fuzzyFind(FFReq, [&](const Symbol ) { Base = S.ID; });
+
+  RelationsRequest Req;
+  Req.Subjects.insert(Base);
+  Req.Predicate = RelationKind::BaseOf;
+  uint32_t Results = 0;
+  Index->relations(Req, [&](const SymbolID &, const Symbol &) { ++Results; });
+  

[PATCH] D89297: [clangd] Add a TestWorkspace utility

2020-10-24 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 rGaaa8b44d1991: [clangd] Add a TestWorkspace utility (authored 
by nridge).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89297

Files:
  clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/FileIndexTests.cpp
  clang-tools-extra/clangd/unittests/TestTU.cpp
  clang-tools-extra/clangd/unittests/TestTU.h
  clang-tools-extra/clangd/unittests/TestWorkspace.cpp
  clang-tools-extra/clangd/unittests/TestWorkspace.h
  llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn

Index: llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
===
--- llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
+++ llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
@@ -96,6 +96,7 @@
 "TestFS.cpp",
 "TestIndex.cpp",
 "TestTU.cpp",
+"TestWorkspace.cpp",
 "TweakTesting.cpp",
 "TweakTests.cpp",
 "TypeHierarchyTests.cpp",
Index: clang-tools-extra/clangd/unittests/TestWorkspace.h
===
--- /dev/null
+++ clang-tools-extra/clangd/unittests/TestWorkspace.h
@@ -0,0 +1,59 @@
+//===--- TestWorkspace.h - Utility for writing multi-file tests --*- C++-*-===//
+//
+// 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
+//
+//===--===//
+//
+// TestWorkspace builds on TestTU to provide a way to write tests involving
+// several related files with inclusion relationships between them.
+//
+// The tests can exercise both index and AST based operations.
+//
+//===-===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
+#define LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
+
+#include "TestFS.h"
+#include "TestTU.h"
+#include "index/FileIndex.h"
+#include "index/Index.h"
+#include "llvm/ADT/StringRef.h"
+#include 
+#include 
+
+namespace clang {
+namespace clangd {
+
+class TestWorkspace {
+public:
+  // The difference between addSource() and addMainFile() is that only main
+  // files will be indexed.
+  void addSource(llvm::StringRef Filename, llvm::StringRef Code) {
+addInput(Filename.str(), {Code.str(), /*IsMainFile=*/false});
+  }
+  void addMainFile(llvm::StringRef Filename, llvm::StringRef Code) {
+addInput(Filename.str(), {Code.str(), /*IsMainFile=*/true});
+  }
+
+  std::unique_ptr index();
+
+  Optional openFile(llvm::StringRef Filename);
+
+private:
+  struct SourceFile {
+std::string Code;
+bool IsMainFile = false;
+  };
+  llvm::StringMap Inputs;
+  TestTU TU;
+
+  void addInput(llvm::StringRef Filename, const SourceFile );
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
Index: clang-tools-extra/clangd/unittests/TestWorkspace.cpp
===
--- /dev/null
+++ clang-tools-extra/clangd/unittests/TestWorkspace.cpp
@@ -0,0 +1,49 @@
+//===--- TestWorkspace.cpp - Utility for writing multi-file tests -*- C++-*===//
+//
+// 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
+//
+//===--===//
+
+#include "TestWorkspace.h"
+
+namespace clang {
+namespace clangd {
+
+std::unique_ptr TestWorkspace::index() {
+  auto Index = std::make_unique();
+  for (const auto  : Inputs) {
+if (!Input.second.IsMainFile)
+  continue;
+TU.Code = Input.second.Code;
+TU.Filename = Input.first().str();
+TU.preamble([&](ASTContext , std::shared_ptr PP,
+const CanonicalIncludes ) {
+  Index->updatePreamble(testPath(Input.first()), "null", Ctx, PP,
+CanonIncludes);
+});
+ParsedAST MainAST = TU.build();
+Index->updateMain(testPath(Input.first()), MainAST);
+  }
+  return Index;
+}
+
+Optional TestWorkspace::openFile(llvm::StringRef Filename) {
+  auto It = Inputs.find(Filename);
+  if (It == Inputs.end()) {
+ADD_FAILURE() << "Accessing non-existing file: " << Filename;
+return llvm::None;
+  }
+  TU.Code = It->second.Code;
+  TU.Filename = It->first().str();
+  return TU.build();
+}
+
+void TestWorkspace::addInput(llvm::StringRef Filename,
+ const SourceFile ) {
+  

[PATCH] D89297: [clangd] Add a TestWorkspace utility

2020-10-24 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 300513.
nridge marked 4 inline comments as done.
nridge added a comment.

address final review comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89297

Files:
  clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/FileIndexTests.cpp
  clang-tools-extra/clangd/unittests/TestTU.cpp
  clang-tools-extra/clangd/unittests/TestTU.h
  clang-tools-extra/clangd/unittests/TestWorkspace.cpp
  clang-tools-extra/clangd/unittests/TestWorkspace.h
  llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn

Index: llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
===
--- llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
+++ llvm/utils/gn/secondary/clang-tools-extra/clangd/unittests/BUILD.gn
@@ -96,6 +96,7 @@
 "TestFS.cpp",
 "TestIndex.cpp",
 "TestTU.cpp",
+"TestWorkspace.cpp",
 "TweakTesting.cpp",
 "TweakTests.cpp",
 "TypeHierarchyTests.cpp",
Index: clang-tools-extra/clangd/unittests/TestWorkspace.h
===
--- /dev/null
+++ clang-tools-extra/clangd/unittests/TestWorkspace.h
@@ -0,0 +1,59 @@
+//===--- TestWorkspace.h - Utility for writing multi-file tests --*- C++-*-===//
+//
+// 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
+//
+//===--===//
+//
+// TestWorkspace builds on TestTU to provide a way to write tests involving
+// several related files with inclusion relationships between them.
+//
+// The tests can exercise both index and AST based operations.
+//
+//===-===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
+#define LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
+
+#include "TestFS.h"
+#include "TestTU.h"
+#include "index/FileIndex.h"
+#include "index/Index.h"
+#include "llvm/ADT/StringRef.h"
+#include 
+#include 
+
+namespace clang {
+namespace clangd {
+
+class TestWorkspace {
+public:
+  // The difference between addSource() and addMainFile() is that only main
+  // files will be indexed.
+  void addSource(llvm::StringRef Filename, llvm::StringRef Code) {
+addInput(Filename.str(), {Code.str(), /*IsMainFile=*/false});
+  }
+  void addMainFile(llvm::StringRef Filename, llvm::StringRef Code) {
+addInput(Filename.str(), {Code.str(), /*IsMainFile=*/true});
+  }
+
+  std::unique_ptr index();
+
+  Optional openFile(llvm::StringRef Filename);
+
+private:
+  struct SourceFile {
+std::string Code;
+bool IsMainFile = false;
+  };
+  llvm::StringMap Inputs;
+  TestTU TU;
+
+  void addInput(llvm::StringRef Filename, const SourceFile );
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANGD_TESTWORKSPACE_H
Index: clang-tools-extra/clangd/unittests/TestWorkspace.cpp
===
--- /dev/null
+++ clang-tools-extra/clangd/unittests/TestWorkspace.cpp
@@ -0,0 +1,49 @@
+//===--- TestWorkspace.cpp - Utility for writing multi-file tests -*- C++-*===//
+//
+// 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
+//
+//===--===//
+
+#include "TestWorkspace.h"
+
+namespace clang {
+namespace clangd {
+
+std::unique_ptr TestWorkspace::index() {
+  auto Index = std::make_unique();
+  for (const auto  : Inputs) {
+if (!Input.second.IsMainFile)
+  continue;
+TU.Code = Input.second.Code;
+TU.Filename = Input.first().str();
+TU.preamble([&](ASTContext , std::shared_ptr PP,
+const CanonicalIncludes ) {
+  Index->updatePreamble(testPath(Input.first()), "null", Ctx, PP,
+CanonIncludes);
+});
+ParsedAST MainAST = TU.build();
+Index->updateMain(testPath(Input.first()), MainAST);
+  }
+  return Index;
+}
+
+Optional TestWorkspace::openFile(llvm::StringRef Filename) {
+  auto It = Inputs.find(Filename);
+  if (It == Inputs.end()) {
+ADD_FAILURE() << "Accessing non-existing file: " << Filename;
+return llvm::None;
+  }
+  TU.Code = It->second.Code;
+  TU.Filename = It->first().str();
+  return TU.build();
+}
+
+void TestWorkspace::addInput(llvm::StringRef Filename,
+ const SourceFile ) {
+  Inputs.insert(std::make_pair(Filename, Input));
+  

[PATCH] D89935: [clangd] NFC: Update FIXME comment regarding lack of c/dtor support

2020-10-24 Thread Nathan Ridge via Phabricator via cfe-commits
nridge added a comment.

Note, I've cargo-culted this comment into `declToTypeHierarchyItem()` as well, 
so whatever change we make here should be made there too.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89935

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


[PATCH] D90101: [Clang][OpenMP][WIP] Avoid unnecessary privatization of mapper array when there is no user defined mapper

2020-10-24 Thread Shilei Tian via Phabricator via cfe-commits
tianshilei1992 updated this revision to Diff 300509.
tianshilei1992 added a comment.

Fixed an issue that caused compiler crash


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90101

Files:
  clang/lib/CodeGen/CGOpenMPRuntime.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp

Index: clang/lib/CodeGen/CGStmtOpenMP.cpp
===
--- clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -4210,16 +4210,21 @@
 /*IndexTypeQuals=*/0);
 SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD,
 S.getBeginLoc());
-MVD = createImplicitFirstprivateForType(
-getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
 TargetScope.addPrivate(
 BPVD, []() { return InputInfo.BasePointersArray; });
 TargetScope.addPrivate(PVD,
[]() { return InputInfo.PointersArray; });
 TargetScope.addPrivate(SVD,
[]() { return InputInfo.SizesArray; });
-TargetScope.addPrivate(MVD,
-   []() { return InputInfo.MappersArray; });
+// If there is no user-defined mapper, the mapper array will be nullptr. In
+// this case, we don't need to privatize it.
+if (!dyn_cast_or_null(
+InputInfo.MappersArray.getPointer())) {
+  MVD = createImplicitFirstprivateForType(
+  getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
+  TargetScope.addPrivate(MVD,
+ []() { return InputInfo.MappersArray; });
+}
   }
   (void)TargetScope.Privatize();
   // Build list of dependences.
@@ -4269,8 +4274,10 @@
   CGF.GetAddrOfLocalVar(PVD), /*Index=*/0);
   InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP(
   CGF.GetAddrOfLocalVar(SVD), /*Index=*/0);
-  InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
-  CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
+  // If MVD is nullptr, the mapper array is not privatized
+  if (MVD)
+InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
+CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
 }
 
 Action.Enter(CGF);
Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp
===
--- clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -8870,10 +8870,8 @@
 /// Additional arguments for emitOffloadingArraysArgument function.
 struct ArgumentsOptions {
   bool ForEndCall = false;
-  bool IsTask = false;
   ArgumentsOptions() = default;
-  ArgumentsOptions(bool ForEndCall, bool IsTask)
-  : ForEndCall(ForEndCall), IsTask(IsTask) {}
+  ArgumentsOptions(bool ForEndCall) : ForEndCall(ForEndCall) {}
 };
 } // namespace
 
@@ -8909,9 +8907,9 @@
 : Info.MapTypesArray,
 /*Idx0=*/0,
 /*Idx1=*/0);
-// Always emit the mapper array address in case of a target task for
-// privatization.
-if (!Options.IsTask && !Info.HasMapper)
+// If there is no user-defined mapper, set the mapper array to nullptr to
+// avoid an unnecessary data privatization
+if (!Info.HasMapper)
   MappersArrayArg = llvm::ConstantPointerNull::get(CGM.VoidPtrPtrTy);
 else
   MappersArrayArg =
@@ -9664,11 +9662,9 @@
 TargetDataInfo Info;
 // Fill up the arrays and create the arguments.
 emitOffloadingArrays(CGF, CombinedInfo, Info);
-bool HasDependClauses = D.hasClausesOfKind();
-emitOffloadingArraysArgument(CGF, Info.BasePointersArray,
- Info.PointersArray, Info.SizesArray,
- Info.MapTypesArray, Info.MappersArray, Info,
- {/*ForEndTask=*/false, HasDependClauses});
+emitOffloadingArraysArgument(
+CGF, Info.BasePointersArray, Info.PointersArray, Info.SizesArray,
+Info.MapTypesArray, Info.MappersArray, Info, {/*ForEndTask=*/false});
 InputInfo.NumberOfTargetItems = Info.NumberOfPtrs;
 InputInfo.BasePointersArray =
 Address(Info.BasePointersArray, CGM.getPointerAlign());
@@ -10319,8 +10315,7 @@
 llvm::Value *MappersArrayArg = nullptr;
 emitOffloadingArraysArgument(CGF, BasePointersArrayArg, PointersArrayArg,
  SizesArrayArg, MapTypesArrayArg,
- MappersArrayArg, Info,
- {/*ForEndCall=*/true, /*IsTask=*/false});
+ MappersArrayArg, Info, {/*ForEndCall=*/true});
 
 // Emit device ID if any.
 llvm::Value *DeviceID = nullptr;
@@ -10519,10 +10514,9 @@
 // Fill up the arrays and create the arguments.
 emitOffloadingArrays(CGF, CombinedInfo, Info);
 bool HasDependClauses = D.hasClausesOfKind();
-

[PATCH] D83088: Introduce CfgTraits abstraction

2020-10-24 Thread Nicolai Hähnle via Phabricator via cfe-commits
nhaehnle added a comment.

I replied on llvm-dev.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83088

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


[PATCH] D84604: Thread safety analysis: Consider global variables in scope

2020-10-24 Thread Aaron Puchert via Phabricator via cfe-commits
aaronpuchert updated this revision to Diff 300507.
aaronpuchert added a comment.

`LiteralPtr`s aren't always globals, local variables are also translated that 
way. So we ask the stored `ValueDecl` if it `isDefinedOutsideFunctionOrMethod`. 
That seems like the right thing.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84604

Files:
  clang/lib/Analysis/ThreadSafety.cpp
  clang/test/SemaCXX/warn-thread-safety-analysis.cpp
  clang/test/SemaCXX/warn-thread-safety-negative.cpp

Index: clang/test/SemaCXX/warn-thread-safety-negative.cpp
===
--- clang/test/SemaCXX/warn-thread-safety-negative.cpp
+++ clang/test/SemaCXX/warn-thread-safety-negative.cpp
@@ -21,6 +21,12 @@
   void AssertReaderHeld() ASSERT_SHARED_LOCK();
 };
 
+class SCOPED_LOCKABLE MutexLock {
+public:
+  MutexLock(Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu);
+  MutexLock(Mutex *mu, bool adopt) EXCLUSIVE_LOCKS_REQUIRED(mu);
+  ~MutexLock() UNLOCK_FUNCTION();
+};
 
 namespace SimpleTest {
 
@@ -77,10 +83,43 @@
 mu.Unlock();
 baz();   // no warning -- !mu in set.
   }
+
+  void test4() {
+MutexLock lock(); // expected-warning {{acquiring mutex 'mu' requires negative capability '!mu'}}
+  }
 };
 
 }  // end namespace SimpleTest
 
+Mutex globalMutex;
+
+namespace ScopeTest {
+
+void f() EXCLUSIVE_LOCKS_REQUIRED(!globalMutex);
+void fq() EXCLUSIVE_LOCKS_REQUIRED(!::globalMutex);
+
+namespace ns {
+  Mutex globalMutex;
+  void f() EXCLUSIVE_LOCKS_REQUIRED(!globalMutex);
+  void fq() EXCLUSIVE_LOCKS_REQUIRED(!ns::globalMutex);
+}
+
+void testGlobals() EXCLUSIVE_LOCKS_REQUIRED(!ns::globalMutex) {
+  f(); // expected-warning {{calling function 'f' requires negative capability '!globalMutex'}}
+  fq();// expected-warning {{calling function 'fq' requires negative capability '!globalMutex'}}
+  ns::f();
+  ns::fq();
+}
+
+void testNamespaceGlobals() EXCLUSIVE_LOCKS_REQUIRED(!globalMutex) {
+  f();
+  fq();
+  ns::f();  // expected-warning {{calling function 'f' requires negative capability '!globalMutex'}}
+  ns::fq(); // expected-warning {{calling function 'fq' requires negative capability '!globalMutex'}}
+}
+
+}  // end namespace ScopeTest
+
 namespace DoubleAttribute {
 
 struct Foo {
Index: clang/test/SemaCXX/warn-thread-safety-analysis.cpp
===
--- clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -5036,7 +5036,8 @@
 }
 
 extern const char *deque_log_msg(void) __attribute__((requires_capability(Logger)));
-void logger_entry(void) __attribute__((requires_capability(Logger))) {
+void logger_entry(void) __attribute__((requires_capability(Logger)))
+__attribute__((requires_capability(!FlightControl))) {
   const char *msg;
 
   while ((msg = deque_log_msg())) {
@@ -5044,13 +5045,13 @@
   }
 }
 
-void spawn_fake_logger_thread(void) {
+void spawn_fake_logger_thread(void) __attribute__((requires_capability(!FlightControl))) {
   acquire(Logger);
   logger_entry();
   release(Logger);
 }
 
-int main(void) {
+int main(void) __attribute__((requires_capability(!FlightControl))) {
   spawn_fake_flight_control_thread();
   spawn_fake_logger_thread();
 
Index: clang/lib/Analysis/ThreadSafety.cpp
===
--- clang/lib/Analysis/ThreadSafety.cpp
+++ clang/lib/Analysis/ThreadSafety.cpp
@@ -1266,13 +1266,24 @@
 }
 
 bool ThreadSafetyAnalyzer::inCurrentScope(const CapabilityExpr ) {
-  if (!CurrentMethod)
+  const threadSafety::til::SExpr *SExp = CapE.sexpr();
+  assert(SExp && "Null expressions should be ignored");
+
+  // Global variables are always in scope.
+  if (const auto *LP = dyn_cast(SExp)) {
+const ValueDecl *VD = LP->clangDecl();
+return VD->isDefinedOutsideFunctionOrMethod();
+  }
+
+  // Members are in scope from methods of the same class.
+  if (const auto *P = dyn_cast(SExp)) {
+if (!CurrentMethod)
   return false;
-  if (const auto *P = dyn_cast_or_null(CapE.sexpr())) {
 const auto *VD = P->clangDecl();
 if (VD)
   return VD->getDeclContext() == CurrentMethod->getDeclContext();
   }
+
   return false;
 }
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D84604: Thread safety analysis: Consider global variables in scope

2020-10-24 Thread Aaron Puchert via Phabricator via cfe-commits
aaronpuchert reopened this revision.
aaronpuchert added a comment.
This revision is now accepted and ready to land.

Almost forgot about that. I think I've figured it out.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84604

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


[PATCH] D87528: Enable '#pragma STDC FENV_ACCESS' in frontend

2020-10-24 Thread Melanie Blower via Phabricator via cfe-commits
mibintc updated this revision to Diff 300494.
mibintc retitled this revision from "Enable '#pragma STDC FENV_ACCESS' in 
frontend cf. D69272 - Work in Progress" to "Enable '#pragma STDC FENV_ACCESS' 
in frontend".
mibintc added a comment.

I updated the test cases, added documentation about constant folding to the 
UserManual. I'll push the patch tomorrow if I don't hear to the contrary thanks 
everybody!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87528

Files:
  clang/docs/UsersManual.rst
  clang/include/clang/AST/Decl.h
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/DiagnosticASTKinds.td
  clang/include/clang/Basic/DiagnosticParseKinds.td
  clang/include/clang/Basic/LangOptions.h
  clang/include/clang/Sema/ScopeInfo.h
  clang/include/clang/Sema/Sema.h
  clang/lib/AST/ExprConstant.cpp
  clang/lib/CodeGen/CGCall.cpp
  clang/lib/CodeGen/CodeGenFunction.cpp
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/lib/CodeGen/CodeGenModule.h
  clang/lib/Parse/ParsePragma.cpp
  clang/lib/Parse/ParseStmt.cpp
  clang/lib/Sema/ScopeInfo.cpp
  clang/lib/Sema/SemaAttr.cpp
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaStmt.cpp
  clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/lib/Serialization/ASTWriterDecl.cpp
  clang/test/CXX/expr/expr.const/p2-0x.cpp
  clang/test/CodeGen/fp-floatcontrol-pragma.cpp
  clang/test/CodeGen/pragma-fenv_access.c
  clang/test/Parser/fp-floatcontrol-syntax.cpp
  clang/test/Parser/pragma-fenv_access.c
  clang/test/Preprocessor/pragma_unknown.c

Index: clang/test/Preprocessor/pragma_unknown.c
===
--- clang/test/Preprocessor/pragma_unknown.c
+++ clang/test/Preprocessor/pragma_unknown.c
@@ -16,15 +16,6 @@
 // CHECK: {{^}}#pragma STDC FP_CONTRACT DEFAULT{{$}}
 // CHECK: {{^}}#pragma STDC FP_CONTRACT IN_BETWEEN{{$}}
 
-#pragma STDC FENV_ACCESS ON  // expected-warning {{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
-#pragma STDC FENV_ACCESS OFF
-#pragma STDC FENV_ACCESS DEFAULT
-#pragma STDC FENV_ACCESS IN_BETWEEN   // expected-warning {{expected 'ON' or 'OFF' or 'DEFAULT' in pragma}}
-// CHECK: {{^}}#pragma STDC FENV_ACCESS ON{{$}}
-// CHECK: {{^}}#pragma STDC FENV_ACCESS OFF{{$}}
-// CHECK: {{^}}#pragma STDC FENV_ACCESS DEFAULT{{$}}
-// CHECK: {{^}}#pragma STDC FENV_ACCESS IN_BETWEEN{{$}}
-
 #pragma STDC CX_LIMITED_RANGE ON
 #pragma STDC CX_LIMITED_RANGE OFF
 #pragma STDC CX_LIMITED_RANGE DEFAULT 
Index: clang/test/Parser/pragma-fenv_access.c
===
--- /dev/null
+++ clang/test/Parser/pragma-fenv_access.c
@@ -0,0 +1,54 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -ffp-exception-behavior=strict -DSTRICT -fsyntax-only -verify %s
+// RUN: %clang_cc1 -x c++ -DCPP -DSTRICT -ffp-exception-behavior=strict -fsyntax-only -verify %s
+#ifdef CPP
+#define CONST constexpr
+#else
+#define CONST const
+#endif
+
+#pragma STDC FENV_ACCESS IN_BETWEEN   // expected-warning {{expected 'ON' or 'OFF' or 'DEFAULT' in pragma}}
+
+#pragma STDC FENV_ACCESS OFF
+
+float func_04(int x, float y) {
+  if (x)
+return y + 2;
+  #pragma STDC FENV_ACCESS ON // expected-error{{'#pragma STDC FENV_ACCESS' can only appear at file scope or at the start of a compound statement}}
+  return x + y;
+}
+
+#pragma STDC FENV_ACCESS ON
+int main() {
+  CONST float one = 1.0F ;
+  CONST float three = 3.0F ;
+  CONST float four = 4.0F ;
+  CONST float frac_ok = one/four;
+#if !defined(CPP)
+//expected-note@+2 {{declared here}}
+#endif
+  CONST float frac = one/three;
+  CONST double d = one;
+  CONST int not_too_big = 255;
+  CONST float fnot_too_big = not_too_big;
+  CONST int too_big = 0x7ff0;
+#if defined(CPP)
+//expected-warning@+2{{implicit conversion}}
+#endif
+  CONST float fbig = too_big; // inexact
+#if !defined(CPP)
+#define static_assert _Static_assert
+#endif
+enum {
+  e1 = (int)one, e3 = (int)three, e4 = (int)four, e_four_quarters = (int)(frac_ok * 4)
+};
+static_assert(e1 == 1  && e3 == 3 && e4 == 4 && e_four_quarters == 1, "");
+enum {
+#if !defined(CPP)
+// expected-error@+2 {{not an integer constant expression}} expected-note@+2 {{is not a constant expression}}
+#endif
+  e_three_thirds = (int)(frac * 3)
+};
+  if (one <= four)  return 0;
+  return -1;
+}
Index: clang/test/Parser/fp-floatcontrol-syntax.cpp
===
--- clang/test/Parser/fp-floatcontrol-syntax.cpp
+++ clang/test/Parser/fp-floatcontrol-syntax.cpp
@@ -26,19 +26,13 @@
 double a = 0.0;
 double b = 1.0;
 
-//FIXME At some point this warning will be removed, until then
-//  document the warning
-#ifdef FAST
-// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
-#pragma STDC FENV_ACCESS ON
-#else
-#pragma STDC FENV_ACCESS ON // 

[PATCH] D90101: [Clang][OpenMP][WIP] Avoid unnecessary privatization of mapper array when there is no user defined mapper

2020-10-24 Thread Shilei Tian via Phabricator via cfe-commits
tianshilei1992 created this revision.
Herald added subscribers: cfe-commits, guansong, yaxunl.
Herald added a project: clang.
tianshilei1992 requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.

In current implementation, if it requires an outer task, the mapper array will 
be privatized no matter whether it has mapper. In fact, when there is no 
mapper, the mapper array only contains number of nullptr. In the libomptarget, 
the use of mapper array is `if (mappers_array && mappers_array[i])`, which 
means we can directly set mapper array to nullptr if there is no mapper. This 
can avoid unnecessary data copy.

In this patch, the data privatization will not be emitted if the mapper array 
is nullptr. When it comes to the emit of task body, the nullptr will be used 
directly.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D90101

Files:
  clang/lib/CodeGen/CGOpenMPRuntime.cpp
  clang/lib/CodeGen/CGStmtOpenMP.cpp

Index: clang/lib/CodeGen/CGStmtOpenMP.cpp
===
--- clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -4210,16 +4210,21 @@
 /*IndexTypeQuals=*/0);
 SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD,
 S.getBeginLoc());
-MVD = createImplicitFirstprivateForType(
-getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
 TargetScope.addPrivate(
 BPVD, []() { return InputInfo.BasePointersArray; });
 TargetScope.addPrivate(PVD,
[]() { return InputInfo.PointersArray; });
 TargetScope.addPrivate(SVD,
[]() { return InputInfo.SizesArray; });
-TargetScope.addPrivate(MVD,
-   []() { return InputInfo.MappersArray; });
+// If there is no user-defined mapper, the mapper array will be nullptr. In
+// this case, we don't need to privatize it.
+if (!dyn_cast_or_null(
+InputInfo.MappersArray.getPointer())) {
+  MVD = createImplicitFirstprivateForType(
+  getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
+  TargetScope.addPrivate(MVD,
+ []() { return InputInfo.MappersArray; });
+}
   }
   (void)TargetScope.Privatize();
   // Build list of dependences.
@@ -4269,8 +4274,10 @@
   CGF.GetAddrOfLocalVar(PVD), /*Index=*/0);
   InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP(
   CGF.GetAddrOfLocalVar(SVD), /*Index=*/0);
-  InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
-  CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
+  // If MVD is nullptr, the mapper array is not privatized
+  if (!MVD)
+InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
+CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
 }
 
 Action.Enter(CGF);
Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp
===
--- clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -8870,10 +8870,8 @@
 /// Additional arguments for emitOffloadingArraysArgument function.
 struct ArgumentsOptions {
   bool ForEndCall = false;
-  bool IsTask = false;
   ArgumentsOptions() = default;
-  ArgumentsOptions(bool ForEndCall, bool IsTask)
-  : ForEndCall(ForEndCall), IsTask(IsTask) {}
+  ArgumentsOptions(bool ForEndCall) : ForEndCall(ForEndCall) {}
 };
 } // namespace
 
@@ -8909,9 +8907,9 @@
 : Info.MapTypesArray,
 /*Idx0=*/0,
 /*Idx1=*/0);
-// Always emit the mapper array address in case of a target task for
-// privatization.
-if (!Options.IsTask && !Info.HasMapper)
+// If there is no user-defined mapper, set the mapper array to nullptr to
+// avoid an unnecessary data privatization
+if (!Info.HasMapper)
   MappersArrayArg = llvm::ConstantPointerNull::get(CGM.VoidPtrPtrTy);
 else
   MappersArrayArg =
@@ -9664,11 +9662,9 @@
 TargetDataInfo Info;
 // Fill up the arrays and create the arguments.
 emitOffloadingArrays(CGF, CombinedInfo, Info);
-bool HasDependClauses = D.hasClausesOfKind();
-emitOffloadingArraysArgument(CGF, Info.BasePointersArray,
- Info.PointersArray, Info.SizesArray,
- Info.MapTypesArray, Info.MappersArray, Info,
- {/*ForEndTask=*/false, HasDependClauses});
+emitOffloadingArraysArgument(
+CGF, Info.BasePointersArray, Info.PointersArray, Info.SizesArray,
+Info.MapTypesArray, Info.MappersArray, Info, {/*ForEndTask=*/false});
 InputInfo.NumberOfTargetItems = Info.NumberOfPtrs;
 InputInfo.BasePointersArray =
 Address(Info.BasePointersArray, CGM.getPointerAlign());
@@ -10319,8 +10315,7 @@
 

[clang] 39a0d68 - [X86] Add a stub for Intel's alderlake.

2020-10-24 Thread Benjamin Kramer via cfe-commits

Author: Benjamin Kramer
Date: 2020-10-24T19:01:22+02:00
New Revision: 39a0d6889dee636af3b7fbb69e1ac5c8af777ad0

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

LOG: [X86] Add a stub for Intel's alderlake.

No scheduling, no autodetection.

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/lib/Basic/Targets/X86.cpp
clang/test/CodeGen/attr-target-mv.c
clang/test/CodeGen/target-builtin-noerror.c
clang/test/Driver/x86-march.c
clang/test/Misc/target-invalid-cpu-note.c
clang/test/Preprocessor/predefined-arch-macros.c
compiler-rt/lib/builtins/cpu_model.c
llvm/docs/ReleaseNotes.rst
llvm/include/llvm/Support/X86TargetParser.def
llvm/include/llvm/Support/X86TargetParser.h
llvm/lib/Support/X86TargetParser.cpp
llvm/lib/Target/X86/X86.td
llvm/test/CodeGen/X86/cpus-intel.ll

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 56337177e060..2a7beba73b69 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -190,7 +190,8 @@ X86 Support in Clang
 - The x86 intrinsics ``__rorb``, ``__rorw``, ``__rord``, ``__rorq`, ``_rotr``,
   ``_rotwr`` and ``_lrotr`` may now be used within constant expressions.
 
-- Support for ``-march=sapphirerapids`` was added.
+- Support for ``-march=alderlake``, ``-march=sapphirerapids`` and
+  ``-march=znver3`` was added.
 
 - Support for ``-march=x86-64-v[234]`` has been added.
   See :doc:`UsersManual` for details about these micro-architecture levels.

diff  --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index 3239e3231cc0..4ce3a5d0327f 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -468,6 +468,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions 
,
   case CK_IcelakeServer:
   case CK_Tigerlake:
   case CK_SapphireRapids:
+  case CK_Alderlake:
 // FIXME: Historically, we defined this legacy name, it would be nice to
 // remove it at some point. We've never exposed fine-grained names for
 // recent primary x86 CPUs, and we should keep it that way.
@@ -1308,6 +1309,7 @@ Optional X86TargetInfo::getCPUCacheLineSize() 
const {
 case CK_SapphireRapids:
 case CK_IcelakeClient:
 case CK_IcelakeServer:
+case CK_Alderlake:
 case CK_KNL:
 case CK_KNM:
 // K7

diff  --git a/clang/test/CodeGen/attr-target-mv.c 
b/clang/test/CodeGen/attr-target-mv.c
index 57b266403dfc..adad3c936a99 100644
--- a/clang/test/CodeGen/attr-target-mv.c
+++ b/clang/test/CodeGen/attr-target-mv.c
@@ -12,6 +12,7 @@ int __attribute__((target("arch=icelake-server"))) foo(void) 
{return 7;}
 int __attribute__((target("arch=cooperlake"))) foo(void) {return 8;}
 int __attribute__((target("arch=tigerlake"))) foo(void) {return 9;}
 int __attribute__((target("arch=sapphirerapids"))) foo(void) {return 10;}
+int __attribute__((target("arch=alderlake"))) foo(void) {return 11;}
 int __attribute__((target("default"))) foo(void) { return 2; }
 
 int bar() {
@@ -94,6 +95,8 @@ __attribute__((target("avx,sse4.2"), used)) inline void 
foo_used2(int i, double
 // LINUX: ret i32 9
 // LINUX: define i32 @foo.arch_sapphirerapids()
 // LINUX: ret i32 10
+// LINUX: define i32 @foo.arch_alderlake()
+// LINUX: ret i32 11
 // LINUX: define i32 @foo()
 // LINUX: ret i32 2
 // LINUX: define i32 @bar()

diff  --git a/clang/test/CodeGen/target-builtin-noerror.c 
b/clang/test/CodeGen/target-builtin-noerror.c
index 42164303e4a6..50967c6657cd 100644
--- a/clang/test/CodeGen/target-builtin-noerror.c
+++ b/clang/test/CodeGen/target-builtin-noerror.c
@@ -85,6 +85,7 @@ void verifyfeaturestrings() {
 }
 
 void verifycpustrings() {
+  (void)__builtin_cpu_is("alderlake");
   (void)__builtin_cpu_is("amd");
   (void)__builtin_cpu_is("amdfam10h");
   (void)__builtin_cpu_is("amdfam15h");

diff  --git a/clang/test/Driver/x86-march.c b/clang/test/Driver/x86-march.c
index 26ffc161c273..871f47109b40 100644
--- a/clang/test/Driver/x86-march.c
+++ b/clang/test/Driver/x86-march.c
@@ -80,6 +80,10 @@
 // RUN:   | FileCheck %s -check-prefix=tigerlake
 // tigerlake: "-target-cpu" "tigerlake"
 //
+// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=alderlake 2>&1 
\
+// RUN:   | FileCheck %s -check-prefix=alderlake
+// alderlake: "-target-cpu" "alderlake"
+//
 // RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=lakemont 2>&1 \
 // RUN:   | FileCheck %s -check-prefix=lakemont
 // lakemont: "-target-cpu" "lakemont"

diff  --git a/clang/test/Misc/target-invalid-cpu-note.c 
b/clang/test/Misc/target-invalid-cpu-note.c
index 82165de6f079..d54403331f57 100644
--- a/clang/test/Misc/target-invalid-cpu-note.c
+++ b/clang/test/Misc/target-invalid-cpu-note.c
@@ -21,7 +21,7 @@
 // X86-SAME: nocona, core2, penryn, 

[clang] bd2cf96 - [X86] Add a stub for znver3 based on the little public information there is in AMD's manuals

2020-10-24 Thread Benjamin Kramer via cfe-commits

Author: Benjamin Kramer
Date: 2020-10-24T19:01:22+02:00
New Revision: bd2cf96c098ed0020f5178eda12cf30d3980d9bd

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

LOG: [X86] Add a stub for znver3 based on the little public information there 
is in AMD's manuals

No scheduling, no autodetection. Just enough so -march=znver3 works.

Added: 


Modified: 
clang/lib/Basic/Targets/X86.cpp
clang/test/Misc/target-invalid-cpu-note.c
clang/test/Preprocessor/predefined-arch-macros.c
llvm/include/llvm/Support/X86TargetParser.h
llvm/lib/Support/X86TargetParser.cpp
llvm/lib/Target/X86/X86.td
llvm/test/CodeGen/X86/cpus-amd.ll

Removed: 




diff  --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index c8d96f887e90..3239e3231cc0 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -542,6 +542,9 @@ void X86TargetInfo::getTargetDefines(const LangOptions 
,
   case CK_ZNVER2:
 defineCPUMacros(Builder, "znver2");
 break;
+  case CK_ZNVER3:
+defineCPUMacros(Builder, "znver3");
+break;
   case CK_Geode:
 defineCPUMacros(Builder, "geode");
 break;
@@ -1325,6 +1328,7 @@ Optional X86TargetInfo::getCPUCacheLineSize() 
const {
 // Zen
 case CK_ZNVER1:
 case CK_ZNVER2:
+case CK_ZNVER3:
 // Deprecated
 case CK_x86_64:
 case CK_x86_64_v2:

diff  --git a/clang/test/Misc/target-invalid-cpu-note.c 
b/clang/test/Misc/target-invalid-cpu-note.c
index a2d20c31caa4..82165de6f079 100644
--- a/clang/test/Misc/target-invalid-cpu-note.c
+++ b/clang/test/Misc/target-invalid-cpu-note.c
@@ -24,7 +24,7 @@
 // X86-SAME: skx, cascadelake, cooperlake, cannonlake, icelake-client, 
icelake-server, tigerlake, sapphirerapids, knl, knm, lakemont, k6, k6-2, k6-3,
 // X86-SAME: athlon, athlon-tbird, athlon-xp, athlon-mp, athlon-4, k8, 
athlon64,
 // X86-SAME: athlon-fx, opteron, k8-sse3, athlon64-sse3, opteron-sse3, 
amdfam10,
-// X86-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, 
znver1, znver2,
+// X86-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, 
znver1, znver2, znver3,
 // X86-SAME: x86-64, x86-64-v2, x86-64-v3, x86-64-v4, geode{{$}}
 
 // RUN: not %clang_cc1 -triple x86_64--- -target-cpu not-a-cpu -fsyntax-only 
%s 2>&1 | FileCheck %s --check-prefix X86_64
@@ -35,7 +35,7 @@
 // X86_64-SAME: core-avx2, broadwell, skylake, skylake-avx512, skx, 
cascadelake, cooperlake, cannonlake,
 // X86_64-SAME: icelake-client, icelake-server, tigerlake, sapphirerapids, 
knl, knm, k8, athlon64, athlon-fx, opteron, k8-sse3,
 // X86_64-SAME: athlon64-sse3, opteron-sse3, amdfam10, barcelona, btver1,
-// X86_64-SAME: btver2, bdver1, bdver2, bdver3, bdver4, znver1, znver2,
+// X86_64-SAME: btver2, bdver1, bdver2, bdver3, bdver4, znver1, znver2, znver3,
 // X86_64-SAME: x86-64, x86-64-v2, x86-64-v3, x86-64-v4{{$}}
 
 // RUN: not %clang_cc1 -triple i386--- -tune-cpu not-a-cpu -fsyntax-only %s 
2>&1 | FileCheck %s --check-prefix TUNE_X86
@@ -49,7 +49,7 @@
 // TUNE_X86-SAME: skx, cascadelake, cooperlake, cannonlake, icelake-client, 
icelake-server, tigerlake, sapphirerapids, knl, knm, lakemont, k6, k6-2, k6-3,
 // TUNE_X86-SAME: athlon, athlon-tbird, athlon-xp, athlon-mp, athlon-4, k8, 
athlon64,
 // TUNE_X86-SAME: athlon-fx, opteron, k8-sse3, athlon64-sse3, opteron-sse3, 
amdfam10,
-// TUNE_X86-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, 
znver1, znver2,
+// TUNE_X86-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, 
znver1, znver2, znver3,
 // TUNE_X86-SAME: x86-64, geode{{$}}
 
 // RUN: not %clang_cc1 -triple x86_64--- -tune-cpu not-a-cpu -fsyntax-only %s 
2>&1 | FileCheck %s --check-prefix TUNE_X86_64
@@ -63,7 +63,7 @@
 // TUNE_X86_64-SAME: skx, cascadelake, cooperlake, cannonlake, icelake-client, 
icelake-server, tigerlake, sapphirerapids, knl, knm, lakemont, k6, k6-2, k6-3,
 // TUNE_X86_64-SAME: athlon, athlon-tbird, athlon-xp, athlon-mp, athlon-4, k8, 
athlon64,
 // TUNE_X86_64-SAME: athlon-fx, opteron, k8-sse3, athlon64-sse3, opteron-sse3, 
amdfam10,
-// TUNE_X86_64-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, 
bdver4, znver1, znver2,
+// TUNE_X86_64-SAME: barcelona, btver1, btver2, bdver1, bdver2, bdver3, 
bdver4, znver1, znver2, znver3,
 // TUNE_X86_64-SAME: x86-64, geode{{$}}
 
 // RUN: not %clang_cc1 -triple nvptx--- -target-cpu not-a-cpu -fsyntax-only %s 
2>&1 | FileCheck %s --check-prefix NVPTX

diff  --git a/clang/test/Preprocessor/predefined-arch-macros.c 
b/clang/test/Preprocessor/predefined-arch-macros.c
index f8ee187b15f3..65089e8f97c7 100644
--- a/clang/test/Preprocessor/predefined-arch-macros.c
+++ b/clang/test/Preprocessor/predefined-arch-macros.c
@@ -3154,6 +3154,110 @@
 // CHECK_ZNVER2_M64: #define __znver2 1
 // 

[clang] b8d2b6f - Unbreak the clang-interpreter example after 0aec49c8531bc5282b095730d34681455826bc2c

2020-10-24 Thread Benjamin Kramer via cfe-commits

Author: Benjamin Kramer
Date: 2020-10-24T19:01:21+02:00
New Revision: b8d2b6f6cf6015751fc950c3e8149404e8b37fe8

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

LOG: Unbreak the clang-interpreter example after 
0aec49c8531bc5282b095730d34681455826bc2c

Added: 


Modified: 
clang/examples/clang-interpreter/main.cpp

Removed: 




diff  --git a/clang/examples/clang-interpreter/main.cpp 
b/clang/examples/clang-interpreter/main.cpp
index 6b4cdca15fb0..342d42089472 100644
--- a/clang/examples/clang-interpreter/main.cpp
+++ b/clang/examples/clang-interpreter/main.cpp
@@ -72,6 +72,11 @@ class SimpleJIT {
   }
 
 public:
+  ~SimpleJIT() {
+if (auto Err = ES.endSession())
+  ES.reportError(std::move(Err));
+  }
+
   static Expected> Create() {
 auto JTMB = JITTargetMachineBuilder::detectHost();
 if (!JTMB)



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


[PATCH] D90099: [Clang][OpenMP] Added the support for target data nowait

2020-10-24 Thread Shilei Tian via Phabricator via cfe-commits
tianshilei1992 created this revision.
Herald added subscribers: cfe-commits, guansong, yaxunl.
Herald added a project: clang.
tianshilei1992 requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.

Previously we added support for target nowait, but target data nowait
has not been supported yet. In this patch, target data nowait will also be
wrapped into a task.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D90099

Files:
  clang/lib/CodeGen/CGOpenMPRuntime.cpp


Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp
===
--- clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -10518,11 +10518,12 @@
 TargetDataInfo Info;
 // Fill up the arrays and create the arguments.
 emitOffloadingArrays(CGF, CombinedInfo, Info);
-bool HasDependClauses = D.hasClausesOfKind();
+const bool RequiresOuterTask = D.hasClausesOfKind() ||
+   D.hasClausesOfKind();
 emitOffloadingArraysArgument(CGF, Info.BasePointersArray,
  Info.PointersArray, Info.SizesArray,
  Info.MapTypesArray, Info.MappersArray, Info,
- {/*ForEndTask=*/false, HasDependClauses});
+ {/*ForEndTask=*/false, RequiresOuterTask});
 InputInfo.NumberOfTargetItems = Info.NumberOfPtrs;
 InputInfo.BasePointersArray =
 Address(Info.BasePointersArray, CGM.getPointerAlign());
@@ -10532,7 +10533,7 @@
 Address(Info.SizesArray, CGM.getPointerAlign());
 InputInfo.MappersArray = Address(Info.MappersArray, CGM.getPointerAlign());
 MapTypesArray = Info.MapTypesArray;
-if (HasDependClauses)
+if (RequiresOuterTask)
   CGF.EmitOMPTargetTaskBasedDirective(D, ThenGen, InputInfo);
 else
   emitInlinedDirective(CGF, D.getDirectiveKind(), ThenGen);


Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp
===
--- clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -10518,11 +10518,12 @@
 TargetDataInfo Info;
 // Fill up the arrays and create the arguments.
 emitOffloadingArrays(CGF, CombinedInfo, Info);
-bool HasDependClauses = D.hasClausesOfKind();
+const bool RequiresOuterTask = D.hasClausesOfKind() ||
+   D.hasClausesOfKind();
 emitOffloadingArraysArgument(CGF, Info.BasePointersArray,
  Info.PointersArray, Info.SizesArray,
  Info.MapTypesArray, Info.MappersArray, Info,
- {/*ForEndTask=*/false, HasDependClauses});
+ {/*ForEndTask=*/false, RequiresOuterTask});
 InputInfo.NumberOfTargetItems = Info.NumberOfPtrs;
 InputInfo.BasePointersArray =
 Address(Info.BasePointersArray, CGM.getPointerAlign());
@@ -10532,7 +10533,7 @@
 Address(Info.SizesArray, CGM.getPointerAlign());
 InputInfo.MappersArray = Address(Info.MappersArray, CGM.getPointerAlign());
 MapTypesArray = Info.MapTypesArray;
-if (HasDependClauses)
+if (RequiresOuterTask)
   CGF.EmitOMPTargetTaskBasedDirective(D, ThenGen, InputInfo);
 else
   emitInlinedDirective(CGF, D.getDirectiveKind(), ThenGen);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D79773: [clang-format] Improve clang-formats handling of concepts

2020-10-24 Thread MyDeveloperDay via Phabricator via cfe-commits
MyDeveloperDay updated this revision to Diff 300489.
MyDeveloperDay added a comment.

Rebase the patch


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

https://reviews.llvm.org/D79773

Files:
  clang/docs/ClangFormatStyleOptions.rst
  clang/docs/ReleaseNotes.rst
  clang/include/clang/Format/Format.h
  clang/lib/Format/Format.cpp
  clang/lib/Format/FormatToken.h
  clang/lib/Format/TokenAnnotator.cpp
  clang/lib/Format/UnwrappedLineParser.cpp
  clang/lib/Format/UnwrappedLineParser.h
  clang/unittests/Format/FormatTest.cpp

Index: clang/unittests/Format/FormatTest.cpp
===
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -14044,6 +14044,7 @@
   CHECK_PARSE_BOOL(BinPackArguments);
   CHECK_PARSE_BOOL(BinPackParameters);
   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
+  CHECK_PARSE_BOOL(BreakBeforeConceptDeclarations);
   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
   CHECK_PARSE_BOOL(BreakStringLiterals);
   CHECK_PARSE_BOOL(CompactNamespaces);
@@ -14055,6 +14056,7 @@
   CHECK_PARSE_BOOL(IndentCaseLabels);
   CHECK_PARSE_BOOL(IndentCaseBlocks);
   CHECK_PARSE_BOOL(IndentGotoLabels);
+  CHECK_PARSE_BOOL(IndentRequires);
   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
@@ -17206,6 +17208,277 @@
"}",
Style);
 }
+
+TEST_F(FormatTest, ConceptsAndRequires) {
+  FormatStyle Style = getLLVMStyle();
+  Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
+
+  verifyFormat("template \n"
+   "concept Hashable = requires(T a) {\n"
+   "  { std::hash{}(a) } -> std::convertible_to;\n"
+   "};",
+   Style);
+  verifyFormat("template \n"
+   "concept EqualityComparable = requires(T a, T b) {\n"
+   "  { a == b } -> bool;\n"
+   "};",
+   Style);
+  verifyFormat("template \n"
+   "concept EqualityComparable = requires(T a, T b) {\n"
+   "  { a == b } -> bool;\n"
+   "  { a != b } -> bool;\n"
+   "};",
+   Style);
+  verifyFormat("template \n"
+   "concept EqualityComparable = requires(T a, T b) {\n"
+   "  { a == b } -> bool;\n"
+   "  { a != b } -> bool;\n"
+   "};",
+   Style);
+
+  verifyFormat("template \n"
+   "requires Iterator\n"
+   "void sort(It begin, It end) {\n"
+   "  //\n"
+   "}",
+   Style);
+
+  verifyFormat("template \n"
+   "concept Large = sizeof(T) > 10;",
+   Style);
+
+  verifyFormat("template \n"
+   "concept FooableWith = requires(T t, U u) {\n"
+   "  typename T::foo_type;\n"
+   "  { t.foo(u) } -> typename T::foo_type;\n"
+   "  t++;\n"
+   "};\n"
+   "void doFoo(FooableWith auto t) {\n"
+   "  t.foo(3);\n"
+   "}",
+   Style);
+  verifyFormat("template \n"
+   "concept Context = sizeof(T) == 1;",
+   Style);
+  verifyFormat("template \n"
+   "concept Context = is_specialization_of_v;",
+   Style);
+  verifyFormat("template \n"
+   "concept Node = std::is_object_v;",
+   Style);
+  verifyFormat("template \n"
+   "concept Tree = true;",
+   Style);
+
+  verifyFormat("template  int g(T i) requires Concept1 {\n"
+   "  //...\n"
+   "}",
+   Style);
+
+  verifyFormat(
+  "template  int g(T i) requires Concept1 && Concept2 {\n"
+  "  //...\n"
+  "}",
+  Style);
+
+  verifyFormat(
+  "template  int g(T i) requires Concept1 || Concept2 {\n"
+  "  //...\n"
+  "}",
+  Style);
+
+  verifyFormat("template \n"
+   "veryveryvery_long_return_type g(T i) requires Concept1 || "
+   "Concept2 {\n"
+   "  //...\n"
+   "}",
+   Style);
+
+  verifyFormat("template \n"
+   "veryveryvery_long_return_type g(T i) requires Concept1 && "
+   "Concept2 {\n"
+   "  //...\n"
+   "}",
+   Style);
+
+  verifyFormat(
+  "template \n"
+  "veryveryvery_long_return_type g(T i) requires Concept1 && Concept2 {\n"
+  "  //...\n"
+  "}",
+  Style);
+
+  verifyFormat(
+  "template \n"
+  "veryveryvery_long_return_type g(T i) requires Concept1 || Concept2 {\n"
+  "  //...\n"
+  "}",
+  Style);
+
+  verifyFormat("template \n"
+   "requires Foo() && Bar {\n"
+   "  //\n"
+   "}",
+   Style);
+
+  verifyFormat("template \n"
+   "requires Foo>() && Bar> {\n"
+   "  //\n"
+ 

[PATCH] D89844: [Clang][OpenMP] Fixed an issue of segment fault when using target nowait

2020-10-24 Thread Shilei Tian via Phabricator via cfe-commits
tianshilei1992 added a comment.

I don't think the failed case has anything to do with this patch. It must be a 
random issue in the bolt.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89844

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


[PATCH] D88553: [clangd] Start using SyntaxTrees for folding ranges feature

2020-10-24 Thread Kirill Bobyrev via Phabricator via cfe-commits
kbobyrev added inline comments.



Comment at: clang-tools-extra/clangd/SemanticSelection.cpp:60
+   *RBrace = cast_or_null(
+   Stmt->findChild(syntax::NodeRole::CloseParen));
+if (!LBrace || !RBrace)

sammccall wrote:
> strictly this should probably be findLastChild both semantically and for 
> performance... but that doesn't exist, because it's a single-linked list for 
> now.
> 
> Not a big deal in practice, but we should fix this (and add STL iterators!)
Added a FIXME.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D88553

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


[PATCH] D87989: [Flang][Driver] Add infrastructure for basic frontend actions and file I/O

2020-10-24 Thread Andrzej Warzynski via Phabricator via cfe-commits
awarzynski added a comment.

Thank you all for your input! Before merging I took the liberty to rename 
`NoClangOption` as `FlangOnlyOption`. The new name reflects better what the 
flag is introduced for. Also, based on responses to [1], it is unlikely that it 
will be used beyond flang-only options. If that changes we can always rename it.

[1] http://lists.llvm.org/pipermail/cfe-dev/2020-October/066953.html


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87989

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


[PATCH] D87989: [Flang][Driver] Add infrastructure for basic frontend actions and file I/O

2020-10-24 Thread Andrzej Warzynski 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 rG4c5906cffd04: [Flang][Driver] Add infrastructure for basic 
frontend actions and file I/O (authored by CarolineConcatto, committed by 
awarzynski).

Changed prior to commit:
  https://reviews.llvm.org/D87989?vs=299033=300485#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87989

Files:
  clang/include/clang/Driver/Options.h
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChains/Flang.cpp
  clang/lib/Driver/Types.cpp
  clang/test/Driver/immediate-options.c
  flang/include/flang/Frontend/CompilerInstance.h
  flang/include/flang/Frontend/CompilerInvocation.h
  flang/include/flang/Frontend/FrontendAction.h
  flang/include/flang/Frontend/FrontendActions.h
  flang/include/flang/Frontend/FrontendOptions.h
  flang/include/flang/FrontendTool/Utils.h
  flang/lib/Frontend/CMakeLists.txt
  flang/lib/Frontend/CompilerInstance.cpp
  flang/lib/Frontend/CompilerInvocation.cpp
  flang/lib/Frontend/FrontendAction.cpp
  flang/lib/Frontend/FrontendActions.cpp
  flang/lib/Frontend/FrontendOptions.cpp
  flang/lib/FrontendTool/CMakeLists.txt
  flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
  flang/test/Flang-Driver/driver-help-hidden.f90
  flang/test/Flang-Driver/driver-help.f90
  flang/test/Flang-Driver/emit-obj.f90
  flang/test/Frontend/Inputs/hello-world.f90
  flang/test/Frontend/input-output-file.f90
  flang/test/Frontend/multiple-input-files.f90
  flang/test/lit.cfg.py
  flang/tools/flang-driver/fc1_main.cpp
  flang/unittests/Frontend/CMakeLists.txt
  flang/unittests/Frontend/CompilerInstanceTest.cpp
  flang/unittests/Frontend/InputOutputTest.cpp

Index: flang/unittests/Frontend/InputOutputTest.cpp
===
--- /dev/null
+++ flang/unittests/Frontend/InputOutputTest.cpp
@@ -0,0 +1,76 @@
+//===- unittests/Frontend/OutputStreamTest.cpp --- FrontendAction tests --===//
+//
+// 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
+//
+//===--===//
+
+#include "gtest/gtest.h"
+#include "flang/Frontend/CompilerInstance.h"
+#include "flang/Frontend/CompilerInvocation.h"
+#include "flang/Frontend/FrontendOptions.h"
+#include "flang/FrontendTool/Utils.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace Fortran::frontend;
+
+namespace {
+
+TEST(FrontendAction, TestInputOutputTestAction) {
+  std::string inputFile = "io-file-test.f";
+  std::error_code ec;
+
+  // 1. Create the input file for the file manager
+  // AllSources (which is used to manage files inside every compiler instance),
+  // works with paths. This means that it requires a physical file. Create one.
+  std::unique_ptr os{
+  new llvm::raw_fd_ostream(inputFile, ec, llvm::sys::fs::OF_None)};
+  if (ec)
+FAIL() << "Failed to create the input file";
+
+  // Populate the input file with the pre-defined input and flush it.
+  *(os) << "End Program arithmetic";
+  os.reset();
+
+  // Get the path of the input file
+  llvm::SmallString<64> cwd;
+  if (std::error_code ec = llvm::sys::fs::current_path(cwd))
+FAIL() << "Failed to obtain the current working directory";
+  std::string testFilePath(cwd.c_str());
+  testFilePath += "/" + inputFile;
+
+  // 2. Prepare the compiler (CompilerInvocation + CompilerInstance)
+  CompilerInstance compInst;
+  compInst.CreateDiagnostics();
+  auto invocation = std::make_shared();
+  invocation->GetFrontendOpts().programAction_ = InputOutputTest;
+  compInst.SetInvocation(std::move(invocation));
+  compInst.GetFrontendOpts().inputs_.push_back(
+  FrontendInputFile(/*File=*/testFilePath, Language::Fortran));
+
+  // 3. Set-up the output stream. Using output buffer wrapped as an output
+  // stream, as opposed to an actual file (or a file descriptor).
+  llvm::SmallVector outputFileBuffer;
+  std::unique_ptr outputFileStream(
+  new llvm::raw_svector_ostream(outputFileBuffer));
+  compInst.SetOutputStream(std::move(outputFileStream));
+
+  // 4. Run the earlier defined FrontendAction
+  bool success = ExecuteCompilerInvocation();
+
+  EXPECT_TRUE(success);
+  EXPECT_TRUE(!outputFileBuffer.empty());
+  EXPECT_TRUE(llvm::StringRef(outputFileBuffer.data())
+  .startswith("End Program arithmetic"));
+
+  // 5. Clear the input and the output files. Since we used an output buffer,
+  // there are no physical output files to delete.
+  ec = llvm::sys::fs::remove(inputFile);
+  if (ec)
+FAIL() << "Failed to delete the test file";
+
+  compInst.ClearOutputFiles(/*EraseFiles=*/false);
+}
+} // namespace
Index: 

[clang] 4c5906c - [Flang][Driver] Add infrastructure for basic frontend actions and file I/O

2020-10-24 Thread Andrzej Warzynski via cfe-commits

Author: Caroline Concatto
Date: 2020-10-24T14:58:32+01:00
New Revision: 4c5906cffd04202387d2f6b50a47d39c0e4f2c0e

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

LOG: [Flang][Driver] Add infrastructure for basic frontend actions and file I/O

This patch introduces the dependencies required to read and manage input files
provided by the command line option. It also adds the infrastructure to create
and write to output files. The output is sent to either stdout or a file
(specified with the `-o` flag).

Separately, in order to be able to test the code for file I/O, it adds
infrastructure to create frontend actions. As a basic testable example, it adds
the `InputOutputTest` FrontendAction. The sole purpose of this action is to
read a file from the command line and print it either to stdout or the output
file.  This action is run by using the `-test-io` flag also introduced in this
patch (available for `flang-new` and `flang-new -fc1`). With this patch:
```
flang-new -test-io input-file.f90
```
will read input-file.f90 and print it in the output file.

The `InputOutputTest` frontend action has been introduced primarily to
facilitate testing. It is hidden from users (i.e. it's only displayed with
`--help-hidden`). Currently Clang doesn’t have an equivalent action.

`-test-io` is used to trigger the InputOutputTest action in the Flang frontend
driver. This patch makes sure that “flang-new” forwards it to “flang-new -fc1"
by creating a preprocessor job. However, in Flang.cpp, `-test-io` is passed to
“flang-new -fc1” without `-E`. This way we make sure that the preprocessor is
_not_ run in the frontend driver. This is the desired behaviour: `-test-io`
should only read the input file and print it to the output stream.

co-authored-by: Andrzej Warzynski 

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

Added: 
flang/include/flang/Frontend/FrontendAction.h
flang/include/flang/Frontend/FrontendActions.h
flang/lib/Frontend/FrontendAction.cpp
flang/lib/Frontend/FrontendActions.cpp
flang/test/Flang-Driver/driver-help-hidden.f90
flang/test/Frontend/Inputs/hello-world.f90
flang/test/Frontend/input-output-file.f90
flang/test/Frontend/multiple-input-files.f90
flang/unittests/Frontend/InputOutputTest.cpp

Modified: 
clang/include/clang/Driver/Options.h
clang/include/clang/Driver/Options.td
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChains/Flang.cpp
clang/lib/Driver/Types.cpp
clang/test/Driver/immediate-options.c
flang/include/flang/Frontend/CompilerInstance.h
flang/include/flang/Frontend/CompilerInvocation.h
flang/include/flang/Frontend/FrontendOptions.h
flang/include/flang/FrontendTool/Utils.h
flang/lib/Frontend/CMakeLists.txt
flang/lib/Frontend/CompilerInstance.cpp
flang/lib/Frontend/CompilerInvocation.cpp
flang/lib/Frontend/FrontendOptions.cpp
flang/lib/FrontendTool/CMakeLists.txt
flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
flang/test/Flang-Driver/driver-help.f90
flang/test/Flang-Driver/emit-obj.f90
flang/test/lit.cfg.py
flang/tools/flang-driver/fc1_main.cpp
flang/unittests/Frontend/CMakeLists.txt
flang/unittests/Frontend/CompilerInstanceTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Options.h 
b/clang/include/clang/Driver/Options.h
index 06dd3652be94..ae188cec93c2 100644
--- a/clang/include/clang/Driver/Options.h
+++ b/clang/include/clang/Driver/Options.h
@@ -36,7 +36,8 @@ enum ClangFlags {
   LinkOption = (1 << 13),
   FlangOption = (1 << 14),
   FC1Option = (1 << 15),
-  Ignored = (1 << 16),
+  FlangOnlyOption = (1 << 16),
+  Ignored = (1 << 17),
 };
 
 enum ID {

diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 0cab3e8ecc16..0b9817a0cfd4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -60,6 +60,10 @@ def LinkOption : OptionFlag;
 // flang mode.
 def FlangOption : OptionFlag;
 
+// FlangOnlyOption - This option should only be used by Flang (i.e. it is not
+// available for Clang)
+def FlangOnlyOption : OptionFlag;
+
 // FC1Option - This option should be accepted by flang -fc1.
 def FC1Option : OptionFlag;
 
@@ -2130,8 +2134,8 @@ def gno_embed_source : Flag<["-"], "gno-embed-source">, 
Group,
 Flags<[DriverOption]>,
 HelpText<"Restore the default behavior of not embedding source text in 
DWARF debug sections">;
 def headerpad__max__install__names : Joined<["-"], 
"headerpad_max_install_names">;
-def help : Flag<["-", "--"], "help">, Flags<[CC1Option,CC1AsOption, FC1Option, 
FlangOption]>,
-  HelpText<"Display available options">;
+def help : Flag<["-", "--"], "help">, Flags<[CC1Option,CC1AsOption, FC1Option,
+FlangOption]>, 

[PATCH] D90073: [Clang][CodeGen] fix failed assertion

2020-10-24 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added inline comments.



Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4640
 /*D=*/nullptr);
-LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),
- D->getType().isConstQualified());
+if (isa(GD.getDecl()))
+  LT = getLLVMLinkageVarDefinition(cast(GD.getDecl()),

Rather than `isa<>` followed by `cast<>`, this should be using `dyn_cast<>`. 
e.g.,
```
if (const auto *VD = dyn_cast(GD.getDecl()))
  ...
else
  ...
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D90073

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


[PATCH] D88553: [clangd] Start using SyntaxTrees for folding ranges feature

2020-10-24 Thread Kirill Bobyrev via Phabricator via cfe-commits
kbobyrev updated this revision to Diff 300479.
kbobyrev marked 3 inline comments as done.
kbobyrev added a comment.

Decompose locations and add checks for FileID == MainFileID.

Also, rebase on top of master.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D88553

Files:
  clang-tools-extra/clangd/SemanticSelection.cpp
  clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp
  clang/include/clang/Tooling/Syntax/Tree.h
  clang/lib/Tooling/Syntax/Tree.cpp

Index: clang/lib/Tooling/Syntax/Tree.cpp
===
--- clang/lib/Tooling/Syntax/Tree.cpp
+++ clang/lib/Tooling/Syntax/Tree.cpp
@@ -271,29 +271,29 @@
 #endif
 }
 
-syntax::Leaf *syntax::Tree::findFirstLeaf() {
-  for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
-if (auto *L = dyn_cast(C))
+const syntax::Leaf *syntax::Tree::findFirstLeaf() const {
+  for (const auto *C = getFirstChild(); C; C = C->getNextSibling()) {
+if (const auto *L = dyn_cast(C))
   return L;
-if (auto *L = cast(C)->findFirstLeaf())
+if (const auto *L = cast(C)->findFirstLeaf())
   return L;
   }
   return nullptr;
 }
 
-syntax::Leaf *syntax::Tree::findLastLeaf() {
-  syntax::Leaf *Last = nullptr;
-  for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
-if (auto *L = dyn_cast(C))
+const syntax::Leaf *syntax::Tree::findLastLeaf() const {
+  const syntax::Leaf *Last = nullptr;
+  for (const auto *C = getFirstChild(); C; C = C->getNextSibling()) {
+if (const auto *L = dyn_cast(C))
   Last = L;
-else if (auto *L = cast(C)->findLastLeaf())
+else if (const auto *L = cast(C)->findLastLeaf())
   Last = L;
   }
   return Last;
 }
 
-syntax::Node *syntax::Tree::findChild(NodeRole R) {
-  for (auto *C = FirstChild; C; C = C->getNextSibling()) {
+const syntax::Node *syntax::Tree::findChild(NodeRole R) const {
+  for (const auto *C = FirstChild; C; C = C->getNextSibling()) {
 if (C->getRole() == R)
   return C;
   }
Index: clang/include/clang/Tooling/Syntax/Tree.h
===
--- clang/include/clang/Tooling/Syntax/Tree.h
+++ clang/include/clang/Tooling/Syntax/Tree.h
@@ -159,19 +159,21 @@
   Node *getFirstChild() { return FirstChild; }
   const Node *getFirstChild() const { return FirstChild; }
 
-  Leaf *findFirstLeaf();
-  const Leaf *findFirstLeaf() const {
-return const_cast(this)->findFirstLeaf();
+  const Leaf *findFirstLeaf() const;
+  Leaf *findFirstLeaf() {
+return const_cast(const_cast(this)->findFirstLeaf());
   }
 
-  Leaf *findLastLeaf();
-  const Leaf *findLastLeaf() const {
-return const_cast(this)->findLastLeaf();
+  const Leaf *findLastLeaf() const;
+  Leaf *findLastLeaf() {
+return const_cast(const_cast(this)->findLastLeaf());
   }
 
-protected:
   /// Find the first node with a corresponding role.
-  Node *findChild(NodeRole R);
+  const Node *findChild(NodeRole R) const;
+  Node *findChild(NodeRole R) {
+return const_cast(const_cast(this)->findChild(R));
+  }
 
 private:
   /// Prepend \p Child to the list of children and and sets the parent pointer.
Index: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp
@@ -203,26 +203,61 @@
 TEST(FoldingRanges, All) {
   const char *Tests[] = {
   R"cpp(
-[[int global_variable]];
+#define FOO int foo() {\
+  int Variable = 42; \
+}
 
-[[void func() {
-  int v = 100;
-}]]
+// Do not generate folding range for braces within macro expansion.
+FOO
+
+// Do not generate folding range within macro arguments.
+#define FUNCTOR(functor) functor
+void func() {[[
+  FUNCTOR([](){});
+]]}
+
+// Do not generate folding range with a brace coming from macro.
+#define LBRACE {
+void bar() LBRACE
+  int X = 42;
+}
+  )cpp",
+  R"cpp(
+void func() {[[
+  int Variable = 100;
+
+  if (Variable > 5) {[[
+Variable += 42;
+  ]]} else if (Variable++)
+++Variable;
+  else {[[
+Variable--;
+  ]]}
+
+  // Do not generate FoldingRange for empty CompoundStmts.
+  for (;;) {}
+
+  // If there are newlines between {}, we should generate one.
+  for (;;) {[[
+
+  ]]}
+]]}
   )cpp",
   R"cpp(
-[[class Foo {
+class Foo {
 public:
-  [[Foo() {
+  Foo() {[[
 int X = 1;
-  }]]
+  ]]}
 
 private:
-  [[int getBar() {
+  int getBar() {[[
 return 42;
-  }]]
+