[PATCH] D49223: [AST] Check described template at structural equivalence check.

2018-08-07 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 159458.
balazske marked an inline comment as done.
balazske added a comment.

- Renamed methods, simplified code, comments updated.


Repository:
  rC Clang

https://reviews.llvm.org/D49223

Files:
  include/clang/AST/ASTStructuralEquivalence.h
  lib/AST/ASTStructuralEquivalence.cpp
  unittests/AST/StructuralEquivalenceTest.cpp

Index: unittests/AST/StructuralEquivalenceTest.cpp
===
--- unittests/AST/StructuralEquivalenceTest.cpp
+++ unittests/AST/StructuralEquivalenceTest.cpp
@@ -78,11 +78,18 @@
   }
 
   bool testStructuralMatch(Decl *D0, Decl *D1) {
-llvm::DenseSet> NonEquivalentDecls;
-StructuralEquivalenceContext Ctx(
-D0->getASTContext(), D1->getASTContext(), NonEquivalentDecls,
-StructuralEquivalenceKind::Default, false, false);
-return Ctx.IsEquivalent(D0, D1);
+llvm::DenseSet> NonEquivalentDecls01;
+llvm::DenseSet> NonEquivalentDecls10;
+StructuralEquivalenceContext Ctx01(
+D0->getASTContext(), D1->getASTContext(),
+NonEquivalentDecls01, StructuralEquivalenceKind::Default, false, false);
+StructuralEquivalenceContext Ctx10(
+D1->getASTContext(), D0->getASTContext(),
+NonEquivalentDecls10, StructuralEquivalenceKind::Default, false, false);
+bool Eq01 = Ctx01.IsEquivalent(D0, D1);
+bool Eq10 = Ctx10.IsEquivalent(D1, D0);
+EXPECT_EQ(Eq01, Eq10);
+return Eq01;
   }
 
   bool testStructuralMatch(std::tuple t) {
@@ -215,6 +222,14 @@
 struct StructuralEquivalenceFunctionTest : StructuralEquivalenceTest {
 };
 
+TEST_F(StructuralEquivalenceFunctionTest, TemplateVsNonTemplate) {
+  auto t = makeNamedDecls(
+  "void foo();",
+  "template void foo();",
+  Lang_CXX);
+  EXPECT_FALSE(testStructuralMatch(t));
+}
+
 TEST_F(StructuralEquivalenceFunctionTest, ParamConstWithRef) {
   auto t = makeNamedDecls("void foo(int&);",
   "void foo(const int&);", Lang_CXX);
@@ -618,6 +633,14 @@
   EXPECT_FALSE(testStructuralMatch(R0, R1));
 }
 
+TEST_F(StructuralEquivalenceRecordTest, TemplateVsNonTemplate) {
+  auto t = makeDecls(
+  "struct A { };",
+  "template struct A { };",
+  Lang_CXX,
+  cxxRecordDecl(hasName("A")));
+  EXPECT_FALSE(testStructuralMatch(t));
+}
 
 TEST_F(StructuralEquivalenceTest, CompareSameDeclWithMultiple) {
   auto t = makeNamedDecls(
Index: lib/AST/ASTStructuralEquivalence.cpp
===
--- lib/AST/ASTStructuralEquivalence.cpp
+++ lib/AST/ASTStructuralEquivalence.cpp
@@ -1023,7 +1023,7 @@
 return true;
 
   // If any of the records has external storage and we do a minimal check (or
-  // AST import) we assmue they are equivalent. (If we didn't have this
+  // AST import) we assume they are equivalent. (If we didn't have this
   // assumption then `RecordDecl::LoadFieldsFromExternalStorage` could trigger
   // another AST import which in turn would call the structural equivalency
   // check again and finally we'd have an improper result.)
@@ -1497,6 +1497,141 @@
   return !Finish();
 }
 
+bool StructuralEquivalenceContext::CheckCommonEquivalence(Decl *D1, Decl *D2) {
+  // Check for equivalent described template.
+  TemplateDecl *Template1 = D1->getDescribedTemplate();
+  TemplateDecl *Template2 = D2->getDescribedTemplate();
+  if ((Template1 != nullptr) != (Template2 != nullptr))
+return false;
+  if (Template1 && !IsStructurallyEquivalent(*this, Template1, Template2))
+return false;
+
+  // FIXME: Move check for identifier names into this function.
+
+  return true;
+}
+
+bool StructuralEquivalenceContext::CheckKindSpecificEquivalence(
+Decl *D1, Decl *D2) {
+  // FIXME: Switch on all declaration kinds. For now, we're just going to
+  // check the obvious ones.
+  if (auto *Record1 = dyn_cast(D1)) {
+if (auto *Record2 = dyn_cast(D2)) {
+  // Check for equivalent structure names.
+  IdentifierInfo *Name1 = Record1->getIdentifier();
+  if (!Name1 && Record1->getTypedefNameForAnonDecl())
+Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Record2->getIdentifier();
+  if (!Name2 && Record2->getTypedefNameForAnonDecl())
+Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
+  if (!::IsStructurallyEquivalent(Name1, Name2) ||
+  !::IsStructurallyEquivalent(*this, Record1, Record2))
+return false;
+} else {
+  // Record/non-record mismatch.
+  return false;
+}
+  } else if (auto *Enum1 = dyn_cast(D1)) {
+if (auto *Enum2 = dyn_cast(D2)) {
+  // Check for equivalent enum names.
+  IdentifierInfo *Name1 = Enum1->getIdentifier();
+  if (!Name1 && Enum1->getTypedefNameForAnonDecl())
+Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Enum2->getIdentifier();
+  if (!Name2 && Enum2->getTypedefNameForAnon

[PATCH] D49796: [ASTImporter] Load external Decls when getting field index.

2018-08-07 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 159467.
balazske added a comment.

- Added common getFieldIndex.


Repository:
  rC Clang

https://reviews.llvm.org/D49796

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp
  test/ASTMerge/unnamed_fields/Inputs/il.cpp
  test/ASTMerge/unnamed_fields/test.cpp
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2612,6 +2612,40 @@
   R1, recordDecl(has(fieldDecl(hasName("next"));
 }
 
+TEST_P(ASTImporterTestBase, ImportUnnamedFieldsInCorrectOrder) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  void f(int X, int Y, bool Z) {
+(void)[X, Y, Z] { (void)Z; };
+  }
+  )",
+  Lang_CXX11, "input0.cc");
+  auto *FromF = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  auto *ToF = cast_or_null(Import(FromF, Lang_CXX11));
+  EXPECT_TRUE(ToF);
+
+  CXXRecordDecl *FromLambda =
+  cast(cast(cast(
+  FromF->getBody())->body_front())->getSubExpr())->getLambdaClass();
+
+  auto *ToLambda = cast_or_null(Import(FromLambda, Lang_CXX11));
+  EXPECT_TRUE(ToLambda);
+
+  // Check if the fields of the lambda class are imported in correct order.
+  unsigned FromIndex = 0u;
+  for (auto *FromField : FromLambda->fields()) {
+ASSERT_FALSE(FromField->getDeclName());
+auto *ToField = cast_or_null(Import(FromField, Lang_CXX11));
+EXPECT_TRUE(ToField);
+unsigned ToIndex = ASTImporter::getFieldIndex(ToField);
+EXPECT_EQ(ToIndex, FromIndex);
+++FromIndex;
+  }
+
+  EXPECT_EQ(FromIndex, 3u);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: test/ASTMerge/unnamed_fields/test.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/il.cpp
+// RUN: %clang_cc1 -ast-merge %t.1.ast -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
+// CHECK-NOT: warning: field '' declared with incompatible types in different translation units ('bool' vs. 'int')
Index: test/ASTMerge/unnamed_fields/Inputs/il.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/Inputs/il.cpp
@@ -0,0 +1,3 @@
+void f(int X, int Y, bool Z) {
+  auto x = [X, Y, Z] { (void)Z; };
+}
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -71,6 +71,28 @@
 
 namespace clang {
 
+  unsigned ASTImporter::getFieldIndex(Decl *F) {
+assert(F && (isa(*F) || isa(*F)) &&
+"Try to get field index for non-field.");
+
+auto *Owner = dyn_cast(F->getDeclContext());
+if (!Owner)
+  return 0;
+
+unsigned Index = 1;
+for (const auto *D : Owner->decls()) {
+  if (D == F)
+return Index;
+
+  if (isa(*D) || isa(*D))
+++Index;
+}
+
+llvm_unreachable("Field was not found in its parent context.");
+
+return 0;
+  }
+
   template 
   SmallVector
   getCanonicalForwardRedeclChain(Redeclarable* D) {
@@ -2823,23 +2845,6 @@
   return VisitCXXMethodDecl(D);
 }
 
-static unsigned getFieldIndex(Decl *F) {
-  auto *Owner = dyn_cast(F->getDeclContext());
-  if (!Owner)
-return 0;
-
-  unsigned Index = 1;
-  for (const auto *D : Owner->noload_decls()) {
-if (D == F)
-  return Index;
-
-if (isa(*D) || isa(*D))
-  ++Index;
-  }
-
-  return Index;
-}
-
 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
   // Import the major distinguishing characteristics of a variable.
   DeclContext *DC, *LexicalDC;
@@ -2857,7 +2862,9 @@
   for (auto *FoundDecl : FoundDecls) {
 if (auto *FoundField = dyn_cast(FoundDecl)) {
   // For anonymous fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
@@ -2922,7 +2929,9 @@
   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
 if (auto *FoundField = dyn_cast(FoundDecls[I])) {
   // For anonymous indirect fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
Index: include/clang/AST/ASTImporter.h
===
--- include/clang/AST/ASTImporter.h
+++ include/clang/AST/ASTImporter.h
@@ -333,6 +333,13 @@
 /// equivalent.
 bool IsStructurallyEquivalent(QualType From, QualT

[PATCH] D49796: [ASTImporter] Load external Decls when getting field index.

2018-08-08 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 159659.
balazske added a comment.

- Added common getFieldIndex.
- Corrected test ImportUnnamedFieldsInCorrectOrder.


Repository:
  rC Clang

https://reviews.llvm.org/D49796

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp
  test/ASTMerge/unnamed_fields/Inputs/il.cpp
  test/ASTMerge/unnamed_fields/test.cpp
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2641,6 +2641,40 @@
   R1, recordDecl(has(fieldDecl(hasName("next"));
 }
 
+TEST_P(ASTImporterTestBase, ImportUnnamedFieldsInCorrectOrder) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  void f(int X, int Y, bool Z) {
+(void)[X, Y, Z] { (void)Z; };
+  }
+  )",
+  Lang_CXX11, "input0.cc");
+  auto *FromF = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  auto *ToF = cast_or_null(Import(FromF, Lang_CXX11));
+  EXPECT_TRUE(ToF);
+
+  CXXRecordDecl *FromLambda =
+  cast(cast(cast(
+  FromF->getBody())->body_front())->getSubExpr())->getLambdaClass();
+
+  auto *ToLambda = cast_or_null(Import(FromLambda, Lang_CXX11));
+  EXPECT_TRUE(ToLambda);
+
+  // Check if the fields of the lambda class are imported in correct order.
+  unsigned FromIndex = 0u;
+  for (auto *FromField : FromLambda->fields()) {
+ASSERT_FALSE(FromField->getDeclName());
+auto *ToField = cast_or_null(Import(FromField, Lang_CXX11));
+EXPECT_TRUE(ToField);
+unsigned ToIndex = ASTImporter::getFieldIndex(ToField);
+EXPECT_EQ(ToIndex, FromIndex + 1);
+++FromIndex;
+  }
+
+  EXPECT_EQ(FromIndex, 3u);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: test/ASTMerge/unnamed_fields/test.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/il.cpp
+// RUN: %clang_cc1 -ast-merge %t.1.ast -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
+// CHECK-NOT: warning: field '' declared with incompatible types in different translation units ('bool' vs. 'int')
Index: test/ASTMerge/unnamed_fields/Inputs/il.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/Inputs/il.cpp
@@ -0,0 +1,3 @@
+void f(int X, int Y, bool Z) {
+  auto x = [X, Y, Z] { (void)Z; };
+}
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -71,6 +71,28 @@
 
 namespace clang {
 
+  unsigned ASTImporter::getFieldIndex(Decl *F) {
+assert(F && (isa(*F) || isa(*F)) &&
+"Try to get field index for non-field.");
+
+auto *Owner = dyn_cast(F->getDeclContext());
+if (!Owner)
+  return 0;
+
+unsigned Index = 1;
+for (const auto *D : Owner->decls()) {
+  if (D == F)
+return Index;
+
+  if (isa(*D) || isa(*D))
+++Index;
+}
+
+llvm_unreachable("Field was not found in its parent context.");
+
+return 0;
+  }
+
   template 
   SmallVector
   getCanonicalForwardRedeclChain(Redeclarable* D) {
@@ -2829,23 +2851,6 @@
   return VisitCXXMethodDecl(D);
 }
 
-static unsigned getFieldIndex(Decl *F) {
-  auto *Owner = dyn_cast(F->getDeclContext());
-  if (!Owner)
-return 0;
-
-  unsigned Index = 1;
-  for (const auto *D : Owner->noload_decls()) {
-if (D == F)
-  return Index;
-
-if (isa(*D) || isa(*D))
-  ++Index;
-  }
-
-  return Index;
-}
-
 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
   // Import the major distinguishing characteristics of a variable.
   DeclContext *DC, *LexicalDC;
@@ -2863,7 +2868,9 @@
   for (auto *FoundDecl : FoundDecls) {
 if (auto *FoundField = dyn_cast(FoundDecl)) {
   // For anonymous fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
@@ -2928,7 +2935,9 @@
   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
 if (auto *FoundField = dyn_cast(FoundDecls[I])) {
   // For anonymous indirect fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
Index: include/clang/AST/ASTImporter.h
===
--- include/clang/AST/ASTImporter.h
+++ include/clang/AST/ASTImporter.h
@@ -333,6 +333,13 @@
 /// equivalent.

[PATCH] D49796: [ASTImporter] Load external Decls when getting field index.

2018-08-08 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL339226: [ASTImporter] Load external Decls when getting field 
index. (authored by balazske, committed by ).
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

https://reviews.llvm.org/D49796

Files:
  cfe/trunk/include/clang/AST/ASTImporter.h
  cfe/trunk/lib/AST/ASTImporter.cpp
  cfe/trunk/test/ASTMerge/unnamed_fields/Inputs/il.cpp
  cfe/trunk/test/ASTMerge/unnamed_fields/test.cpp
  cfe/trunk/unittests/AST/ASTImporterTest.cpp

Index: cfe/trunk/include/clang/AST/ASTImporter.h
===
--- cfe/trunk/include/clang/AST/ASTImporter.h
+++ cfe/trunk/include/clang/AST/ASTImporter.h
@@ -333,6 +333,13 @@
 /// equivalent.
 bool IsStructurallyEquivalent(QualType From, QualType To,
   bool Complain = true);
+
+/// Determine the index of a field in its parent record.
+/// F should be a field (or indirect field) declaration.
+/// \returns The index of the field in its parent context, starting from 1.
+/// 0 is returned on error (parent context is non-record).
+static unsigned getFieldIndex(Decl *F);
+
   };
 
 } // namespace clang
Index: cfe/trunk/test/ASTMerge/unnamed_fields/Inputs/il.cpp
===
--- cfe/trunk/test/ASTMerge/unnamed_fields/Inputs/il.cpp
+++ cfe/trunk/test/ASTMerge/unnamed_fields/Inputs/il.cpp
@@ -0,0 +1,3 @@
+void f(int X, int Y, bool Z) {
+  auto x = [X, Y, Z] { (void)Z; };
+}
Index: cfe/trunk/test/ASTMerge/unnamed_fields/test.cpp
===
--- cfe/trunk/test/ASTMerge/unnamed_fields/test.cpp
+++ cfe/trunk/test/ASTMerge/unnamed_fields/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/il.cpp
+// RUN: %clang_cc1 -ast-merge %t.1.ast -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
+// CHECK-NOT: warning: field '' declared with incompatible types in different translation units ('bool' vs. 'int')
Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -71,6 +71,28 @@
 
 namespace clang {
 
+  unsigned ASTImporter::getFieldIndex(Decl *F) {
+assert(F && (isa(*F) || isa(*F)) &&
+"Try to get field index for non-field.");
+
+auto *Owner = dyn_cast(F->getDeclContext());
+if (!Owner)
+  return 0;
+
+unsigned Index = 1;
+for (const auto *D : Owner->decls()) {
+  if (D == F)
+return Index;
+
+  if (isa(*D) || isa(*D))
+++Index;
+}
+
+llvm_unreachable("Field was not found in its parent context.");
+
+return 0;
+  }
+
   template 
   SmallVector
   getCanonicalForwardRedeclChain(Redeclarable* D) {
@@ -2829,23 +2851,6 @@
   return VisitCXXMethodDecl(D);
 }
 
-static unsigned getFieldIndex(Decl *F) {
-  auto *Owner = dyn_cast(F->getDeclContext());
-  if (!Owner)
-return 0;
-
-  unsigned Index = 1;
-  for (const auto *D : Owner->noload_decls()) {
-if (D == F)
-  return Index;
-
-if (isa(*D) || isa(*D))
-  ++Index;
-  }
-
-  return Index;
-}
-
 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
   // Import the major distinguishing characteristics of a variable.
   DeclContext *DC, *LexicalDC;
@@ -2863,7 +2868,9 @@
   for (auto *FoundDecl : FoundDecls) {
 if (auto *FoundField = dyn_cast(FoundDecl)) {
   // For anonymous fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
@@ -2928,7 +2935,9 @@
   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
 if (auto *FoundField = dyn_cast(FoundDecls[I])) {
   // For anonymous indirect fields, match up by index.
-  if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
+  if (!Name &&
+  ASTImporter::getFieldIndex(D) !=
+  ASTImporter::getFieldIndex(FoundField))
 continue;
 
   if (Importer.IsStructurallyEquivalent(D->getType(),
Index: cfe/trunk/unittests/AST/ASTImporterTest.cpp
===
--- cfe/trunk/unittests/AST/ASTImporterTest.cpp
+++ cfe/trunk/unittests/AST/ASTImporterTest.cpp
@@ -2641,6 +2641,40 @@
   R1, recordDecl(has(fieldDecl(hasName("next"));
 }
 
+TEST_P(ASTImporterTestBase, ImportUnnamedFieldsInCorrectOrder) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  void f(int X, int Y, bool Z) {
+(void)[X, Y, Z] { (void)Z; };
+  }
+  )",
+  Lang_CXX11, "input0.cc");
+  auto *FromF = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  auto *ToF = cast_or_null(Import(FromF, Lang_CXX11));
+  EXPECT

[PATCH] D49223: [AST] Check described template at structural equivalence check.

2018-08-08 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC339256: [AST] Check described template at structural 
equivalence check. (authored by balazske, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D49223?vs=159458&id=159725#toc

Repository:
  rC Clang

https://reviews.llvm.org/D49223

Files:
  include/clang/AST/ASTStructuralEquivalence.h
  lib/AST/ASTStructuralEquivalence.cpp
  unittests/AST/StructuralEquivalenceTest.cpp

Index: include/clang/AST/ASTStructuralEquivalence.h
===
--- include/clang/AST/ASTStructuralEquivalence.h
+++ include/clang/AST/ASTStructuralEquivalence.h
@@ -114,8 +114,19 @@
 private:
   /// Finish checking all of the structural equivalences.
   ///
-  /// \returns true if an error occurred, false otherwise.
+  /// \returns true if the equivalence check failed (non-equivalence detected),
+  /// false if equivalence was detected.
   bool Finish();
+
+  /// Check for common properties at Finish.
+  /// \returns true if D1 and D2 may be equivalent,
+  /// false if they are for sure not.
+  bool CheckCommonEquivalence(Decl *D1, Decl *D2);
+
+  /// Check for class dependent properties at Finish.
+  /// \returns true if D1 and D2 may be equivalent,
+  /// false if they are for sure not.
+  bool CheckKindSpecificEquivalence(Decl *D1, Decl *D2);
 };
 
 } // namespace clang
Index: lib/AST/ASTStructuralEquivalence.cpp
===
--- lib/AST/ASTStructuralEquivalence.cpp
+++ lib/AST/ASTStructuralEquivalence.cpp
@@ -1023,7 +1023,7 @@
 return true;
 
   // If any of the records has external storage and we do a minimal check (or
-  // AST import) we assmue they are equivalent. (If we didn't have this
+  // AST import) we assume they are equivalent. (If we didn't have this
   // assumption then `RecordDecl::LoadFieldsFromExternalStorage` could trigger
   // another AST import which in turn would call the structural equivalency
   // check again and finally we'd have an improper result.)
@@ -1497,6 +1497,141 @@
   return !Finish();
 }
 
+bool StructuralEquivalenceContext::CheckCommonEquivalence(Decl *D1, Decl *D2) {
+  // Check for equivalent described template.
+  TemplateDecl *Template1 = D1->getDescribedTemplate();
+  TemplateDecl *Template2 = D2->getDescribedTemplate();
+  if ((Template1 != nullptr) != (Template2 != nullptr))
+return false;
+  if (Template1 && !IsStructurallyEquivalent(*this, Template1, Template2))
+return false;
+
+  // FIXME: Move check for identifier names into this function.
+
+  return true;
+}
+
+bool StructuralEquivalenceContext::CheckKindSpecificEquivalence(
+Decl *D1, Decl *D2) {
+  // FIXME: Switch on all declaration kinds. For now, we're just going to
+  // check the obvious ones.
+  if (auto *Record1 = dyn_cast(D1)) {
+if (auto *Record2 = dyn_cast(D2)) {
+  // Check for equivalent structure names.
+  IdentifierInfo *Name1 = Record1->getIdentifier();
+  if (!Name1 && Record1->getTypedefNameForAnonDecl())
+Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Record2->getIdentifier();
+  if (!Name2 && Record2->getTypedefNameForAnonDecl())
+Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
+  if (!::IsStructurallyEquivalent(Name1, Name2) ||
+  !::IsStructurallyEquivalent(*this, Record1, Record2))
+return false;
+} else {
+  // Record/non-record mismatch.
+  return false;
+}
+  } else if (auto *Enum1 = dyn_cast(D1)) {
+if (auto *Enum2 = dyn_cast(D2)) {
+  // Check for equivalent enum names.
+  IdentifierInfo *Name1 = Enum1->getIdentifier();
+  if (!Name1 && Enum1->getTypedefNameForAnonDecl())
+Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Enum2->getIdentifier();
+  if (!Name2 && Enum2->getTypedefNameForAnonDecl())
+Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
+  if (!::IsStructurallyEquivalent(Name1, Name2) ||
+  !::IsStructurallyEquivalent(*this, Enum1, Enum2))
+return false;
+} else {
+  // Enum/non-enum mismatch
+  return false;
+}
+  } else if (const auto *Typedef1 = dyn_cast(D1)) {
+if (const auto *Typedef2 = dyn_cast(D2)) {
+  if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
+  Typedef2->getIdentifier()) ||
+  !::IsStructurallyEquivalent(*this, Typedef1->getUnderlyingType(),
+  Typedef2->getUnderlyingType()))
+return false;
+} else {
+  // Typedef/non-typedef mismatch.
+  return false;
+}
+  } else if (auto *ClassTemplate1 = dyn_cast(D1)) {
+if (auto *ClassTemplate2 = dyn_cast(D2)) {
+  if (!::IsStructurallyEquivalent(*this, ClassTemplate1,
+  ClassTemplate2)

[PATCH] D50516: [ASTImporter] Improved import of friend templates.

2018-08-09 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

When importing a friend class template declaration,
this declaration should not be merged with any other existing declaration
for the same type. Otherwise the getFriendDecl of the FriendDecl can point
to an other already referenced declaration, this case causes problems.
Additionally the previous decl of class templates is set at import.


Repository:
  rC Clang

https://reviews.llvm.org/D50516

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

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2683,6 +2683,93 @@
   EXPECT_EQ(FromIndex, 3u);
 }
 
+TEST_P(
+ASTImporterTestBase,
+ImportOfFriendRecordDoesNotMergeDefinition) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  class A {
+template  class F {};
+class X {
+  template  friend class F;
+};
+  };
+  )",
+  Lang_CXX, "input0.cc");
+
+  auto *FromClass = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("F"), isDefinition()));
+  auto *FromFriendClass = LastDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("F")));
+
+  ASSERT_TRUE(FromClass);
+  ASSERT_TRUE(FromFriendClass);
+  ASSERT_NE(FromClass, FromFriendClass);
+  ASSERT_EQ(FromFriendClass->getDefinition(), FromClass);
+  ASSERT_EQ(FromFriendClass->getPreviousDecl(), FromClass);
+  ASSERT_EQ(
+  FromFriendClass->getDescribedClassTemplate()->getPreviousDecl(),
+  FromClass->getDescribedClassTemplate());
+
+  auto *ToClass = cast(Import(FromClass, Lang_CXX));
+  auto *ToFriendClass = cast(Import(FromFriendClass, Lang_CXX));
+
+  ASSERT_TRUE(ToClass);
+  ASSERT_TRUE(ToFriendClass);
+  EXPECT_NE(ToClass, ToFriendClass);
+  EXPECT_EQ(ToFriendClass->getDefinition(), ToClass);
+  ASSERT_EQ(ToFriendClass->getPreviousDecl(), ToClass);
+  ASSERT_EQ(
+  ToFriendClass->getDescribedClassTemplate()->getPreviousDecl(),
+  ToClass->getDescribedClassTemplate());
+}
+
+TEST_P(
+ASTImporterTestBase,
+ImportOfRecursiveFriendClass) {
+  Decl *FromTu = getTuDecl(
+  R"(
+  class declToImport {
+friend class declToImport;
+  };
+  )",
+  Lang_CXX, "input.cc");
+
+  auto *FromD = FirstDeclMatcher().match(
+  FromTu, cxxRecordDecl(hasName("declToImport")));
+  auto *ToD = Import(FromD, Lang_CXX);
+  auto Pattern = cxxRecordDecl(hasName("declToImport"), has(friendDecl()));
+  ASSERT_TRUE(MatchVerifier{}.match(FromD, Pattern));
+  EXPECT_TRUE(MatchVerifier{}.match(ToD, Pattern));
+}
+
+TEST_P(
+ASTImporterTestBase,
+ImportOfRecursiveFriendClassTemplate) {
+  Decl *FromTu = getTuDecl(
+  R"(
+  template  class declToImport {
+template  friend class declToImport;
+  };
+  )",
+  Lang_CXX, "input.cc");
+
+  auto *FromD = FirstDeclMatcher().match(
+  FromTu, classTemplateDecl(hasName("declToImport")));
+  auto *ToD = Import(FromD, Lang_CXX);
+  
+  auto Pattern = classTemplateDecl(
+  has(cxxRecordDecl(has(friendDecl(has(classTemplateDecl()));
+  ASSERT_TRUE(MatchVerifier{}.match(FromD, Pattern));
+  EXPECT_TRUE(MatchVerifier{}.match(ToD, Pattern));
+  
+  auto *Class =
+  FirstDeclMatcher().match(ToD, classTemplateDecl());
+  auto *Friend = FirstDeclMatcher().match(ToD, friendDecl());
+  EXPECT_NE(Friend->getFriendDecl(), Class);
+  EXPECT_EQ(Friend->getFriendDecl()->getPreviousDecl(), Class);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2164,11 +2164,21 @@
 }
 
 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
+  bool IsFriendTemplate = false;
+  if (auto *DCXX = dyn_cast(D)) {
+IsFriendTemplate =
+DCXX->getDescribedClassTemplate() &&
+DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
+Decl::FOK_None;
+  }
+
   // If this record has a definition in the translation unit we're coming from,
   // but this particular declaration is not that definition, import the
   // definition and map to that.
   TagDecl *Definition = D->getDefinition();
   if (Definition && Definition != D &&
+  // Friend template declaration must be imported on its own.
+  !IsFriendTemplate &&
   // In contrast to a normal CXXRecordDecl, the implicit
   // CXXRecordDecl of ClassTemplateSpecializationDecl is its redeclaration.
   // The definition of the implicit CXXRecordDecl in this case is the
@@ -2241,7 +2251,7 @@
 PrevDecl = FoundRecord;
 
 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
-  if ((SearchName && !D->isCompleteDefinition())
+  if ((SearchName && !D->is

[PATCH] D50516: [ASTImporter] Improved import of friend templates.

2018-08-13 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 160335.
balazske added a comment.

- replaced ASSERT in test


Repository:
  rC Clang

https://reviews.llvm.org/D50516

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

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2677,6 +2677,93 @@
   EXPECT_EQ(FromIndex, 3u);
 }
 
+TEST_P(
+ASTImporterTestBase,
+ImportOfFriendRecordDoesNotMergeDefinition) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  class A {
+template  class F {};
+class X {
+  template  friend class F;
+};
+  };
+  )",
+  Lang_CXX, "input0.cc");
+
+  auto *FromClass = FirstDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("F"), isDefinition()));
+  auto *FromFriendClass = LastDeclMatcher().match(
+  FromTU, cxxRecordDecl(hasName("F")));
+
+  ASSERT_TRUE(FromClass);
+  ASSERT_TRUE(FromFriendClass);
+  ASSERT_NE(FromClass, FromFriendClass);
+  ASSERT_EQ(FromFriendClass->getDefinition(), FromClass);
+  ASSERT_EQ(FromFriendClass->getPreviousDecl(), FromClass);
+  ASSERT_EQ(
+  FromFriendClass->getDescribedClassTemplate()->getPreviousDecl(),
+  FromClass->getDescribedClassTemplate());
+
+  auto *ToClass = cast(Import(FromClass, Lang_CXX));
+  auto *ToFriendClass = cast(Import(FromFriendClass, Lang_CXX));
+
+  EXPECT_TRUE(ToClass);
+  EXPECT_TRUE(ToFriendClass);
+  EXPECT_NE(ToClass, ToFriendClass);
+  EXPECT_EQ(ToFriendClass->getDefinition(), ToClass);
+  EXPECT_EQ(ToFriendClass->getPreviousDecl(), ToClass);
+  EXPECT_EQ(
+  ToFriendClass->getDescribedClassTemplate()->getPreviousDecl(),
+  ToClass->getDescribedClassTemplate());
+}
+
+TEST_P(
+ASTImporterTestBase,
+ImportOfRecursiveFriendClass) {
+  Decl *FromTu = getTuDecl(
+  R"(
+  class declToImport {
+friend class declToImport;
+  };
+  )",
+  Lang_CXX, "input.cc");
+
+  auto *FromD = FirstDeclMatcher().match(
+  FromTu, cxxRecordDecl(hasName("declToImport")));
+  auto *ToD = Import(FromD, Lang_CXX);
+  auto Pattern = cxxRecordDecl(hasName("declToImport"), has(friendDecl()));
+  ASSERT_TRUE(MatchVerifier{}.match(FromD, Pattern));
+  EXPECT_TRUE(MatchVerifier{}.match(ToD, Pattern));
+}
+
+TEST_P(
+ASTImporterTestBase,
+ImportOfRecursiveFriendClassTemplate) {
+  Decl *FromTu = getTuDecl(
+  R"(
+  template  class declToImport {
+template  friend class declToImport;
+  };
+  )",
+  Lang_CXX, "input.cc");
+
+  auto *FromD = FirstDeclMatcher().match(
+  FromTu, classTemplateDecl(hasName("declToImport")));
+  auto *ToD = Import(FromD, Lang_CXX);
+  
+  auto Pattern = classTemplateDecl(
+  has(cxxRecordDecl(has(friendDecl(has(classTemplateDecl()));
+  ASSERT_TRUE(MatchVerifier{}.match(FromD, Pattern));
+  EXPECT_TRUE(MatchVerifier{}.match(ToD, Pattern));
+  
+  auto *Class =
+  FirstDeclMatcher().match(ToD, classTemplateDecl());
+  auto *Friend = FirstDeclMatcher().match(ToD, friendDecl());
+  EXPECT_NE(Friend->getFriendDecl(), Class);
+  EXPECT_EQ(Friend->getFriendDecl()->getPreviousDecl(), Class);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2164,11 +2164,21 @@
 }
 
 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
+  bool IsFriendTemplate = false;
+  if (auto *DCXX = dyn_cast(D)) {
+IsFriendTemplate =
+DCXX->getDescribedClassTemplate() &&
+DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
+Decl::FOK_None;
+  }
+
   // If this record has a definition in the translation unit we're coming from,
   // but this particular declaration is not that definition, import the
   // definition and map to that.
   TagDecl *Definition = D->getDefinition();
   if (Definition && Definition != D &&
+  // Friend template declaration must be imported on its own.
+  !IsFriendTemplate &&
   // In contrast to a normal CXXRecordDecl, the implicit
   // CXXRecordDecl of ClassTemplateSpecializationDecl is its redeclaration.
   // The definition of the implicit CXXRecordDecl in this case is the
@@ -2241,7 +2251,7 @@
 PrevDecl = FoundRecord;
 
 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
-  if ((SearchName && !D->isCompleteDefinition())
+  if ((SearchName && !D->isCompleteDefinition() && !IsFriendTemplate)
   || (D->isCompleteDefinition() &&
   D->isAnonymousStructOrUnion()
 == FoundDef->isAnonymousStructOrUnion() &&
@@ -2281,6 +2291,9 @@
   !IsStructuralMatch(D, FoundRecord))
 continue;
 
+  if (IsFriendTemplate)
+continue;

[PATCH] D50516: [ASTImporter] Improved import of friend templates.

2018-08-13 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL339560: [ASTImporter] Improved import of friend templates. 
(authored by balazske, committed by ).
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

https://reviews.llvm.org/D50516

Files:
  cfe/trunk/lib/AST/ASTImporter.cpp
  cfe/trunk/unittests/AST/ASTImporterTest.cpp

Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -2164,11 +2164,21 @@
 }
 
 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
+  bool IsFriendTemplate = false;
+  if (auto *DCXX = dyn_cast(D)) {
+IsFriendTemplate =
+DCXX->getDescribedClassTemplate() &&
+DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
+Decl::FOK_None;
+  }
+
   // If this record has a definition in the translation unit we're coming from,
   // but this particular declaration is not that definition, import the
   // definition and map to that.
   TagDecl *Definition = D->getDefinition();
   if (Definition && Definition != D &&
+  // Friend template declaration must be imported on its own.
+  !IsFriendTemplate &&
   // In contrast to a normal CXXRecordDecl, the implicit
   // CXXRecordDecl of ClassTemplateSpecializationDecl is its redeclaration.
   // The definition of the implicit CXXRecordDecl in this case is the
@@ -2241,7 +2251,7 @@
 PrevDecl = FoundRecord;
 
 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
-  if ((SearchName && !D->isCompleteDefinition())
+  if ((SearchName && !D->isCompleteDefinition() && !IsFriendTemplate)
   || (D->isCompleteDefinition() &&
   D->isAnonymousStructOrUnion()
 == FoundDef->isAnonymousStructOrUnion() &&
@@ -2281,6 +2291,9 @@
   !IsStructuralMatch(D, FoundRecord))
 continue;
 
+  if (IsFriendTemplate)
+continue;
+
   AdoptDecl = FoundRecord;
   continue;
 } else if (!SearchName) {
@@ -2348,7 +2361,7 @@
 if (!ToDescribed)
   return nullptr;
 D2CXX->setDescribedClassTemplate(ToDescribed);
-if (!DCXX->isInjectedClassName()) {
+if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
   // In a record describing a template the type should be an
   // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
   // previously set type to the correct value here (ToDescribed is not
@@ -4371,12 +4384,14 @@
 }
 
 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
+  bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
+
   // If this record has a definition in the translation unit we're coming from,
   // but this particular declaration is not that definition, import the
   // definition and map to that.
   auto *Definition =
   cast_or_null(D->getTemplatedDecl()->getDefinition());
-  if (Definition && Definition != D->getTemplatedDecl()) {
+  if (Definition && Definition != D->getTemplatedDecl() && !IsFriend) {
 Decl *ImportedDef
   = Importer.Import(Definition->getDescribedClassTemplate());
 if (!ImportedDef)
@@ -4413,17 +4428,20 @@
   // definition. So, try to get the definition if that is available in
   // the redecl chain.
   ClassTemplateDecl *TemplateWithDef = getDefinition(FoundTemplate);
-  if (!TemplateWithDef)
+  if (TemplateWithDef)
+FoundTemplate = TemplateWithDef;
+  else
 continue;
-  FoundTemplate = TemplateWithDef; // Continue with the definition.
 }
 
 if (IsStructuralMatch(D, FoundTemplate)) {
-  // The class templates structurally match; call it the same template.
+  if (!IsFriend) {
+Importer.MapImported(D->getTemplatedDecl(),
+ FoundTemplate->getTemplatedDecl());
+return Importer.MapImported(D, FoundTemplate);
+  }
 
-  Importer.MapImported(D->getTemplatedDecl(),
-   FoundTemplate->getTemplatedDecl());
-  return Importer.MapImported(D, FoundTemplate);
+  continue;
 }
   }
 
@@ -4461,9 +4479,17 @@
 
   ToTemplated->setDescribedClassTemplate(D2);
 
+  if (ToTemplated->getPreviousDecl()) {
+assert(
+ToTemplated->getPreviousDecl()->getDescribedClassTemplate() &&
+"Missing described template");
+D2->setPreviousDecl(
+ToTemplated->getPreviousDecl()->getDescribedClassTemplate());
+  }
   D2->setAccess(D->getAccess());
   D2->setLexicalDeclContext(LexicalDC);
-  LexicalDC->addDeclInternal(D2);
+  if (!IsFriend)
+LexicalDC->addDeclInternal(D2);
 
   if (FromTemplated->isCompleteDefinition() &&
   !ToTemplated->isCompleteDefinition()) {
Index: cfe/trunk/unittests/AST/ASTImporterTest.c

[PATCH] D50672: [ASTImporter] Change the return result of Decl import to Optional

2018-08-14 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

This change is in conflict with our similar patch to introduce error handling 
in `ASTImporter`. That patch would be a much bigger one, because (almost) every 
import can fail, return of every `Import` (not only Decl) is changed from `X` 
to `Expected`. After every import (inside the import functions too) the 
result needs to be checked always for error.


Repository:
  rC Clang

https://reviews.llvm.org/D50672



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


[PATCH] D49798: [ASTImporter] Adding some friend function related unittests.

2018-08-14 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 160548.
balazske added a comment.

- Corrected the code in tests.


Repository:
  rC Clang

https://reviews.llvm.org/D49798

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2275,6 +2275,205 @@
   EXPECT_EQ(ImportedD1->getPreviousDecl(), ImportedD);
 }
 
+TEST_P(ImportFriendFunctions, Lookup) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  Decl *FromTU =
+  getTuDecl("struct X { friend void f(); };", Lang_CXX, "input0.cc");
+  auto *FromD = FirstDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  {
+auto FromName = FromD->getDeclName();
+auto *Class = FirstDeclMatcher().match(FromTU, ClassPattern);
+auto LookupRes = Class->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 0u);
+LookupRes = cast(FromTU)->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 1u);
+  }
+
+  auto *ToD = cast(Import(FromD, Lang_CXX));
+  auto ToName = ToD->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *Class = FirstDeclMatcher().match(ToTU, ClassPattern);
+  auto LookupRes = Class->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  EXPECT_EQ(DeclCounter().match(ToTU, FunctionPattern), 1u);
+  auto *To0 = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, DISABLED_LookupWithProtoAfter) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU =
+  getTuDecl("struct X { friend void f(); };"
+// This proto decl makes f available to normal
+// lookup, otherwise it is hidden.
+// Normal C++ lookup (implemented in
+// `clang::Sema::CppLookupName()` and in `LookupDirect()`)
+// returns the found `NamedDecl` only if the set IDNS is matched
+"void f();",
+Lang_CXX, "input0.cc");
+  auto *From0 = FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *From1 = LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(From0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(From0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_FALSE(From1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  {
+auto Name = From0->getDeclName();
+auto *Class = FirstDeclMatcher().match(FromTU, ClassPattern);
+auto LookupRes = Class->noload_lookup(Name);
+ASSERT_EQ(LookupRes.size(), 0u);
+LookupRes = FromTU->noload_lookup(Name);
+ASSERT_EQ(LookupRes.size(), 1u);
+  }
+
+  auto *To0 = cast(Import(From0, Lang_CXX));
+  auto Name = To0->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *Class = FirstDeclMatcher().match(ToTU, ClassPattern);
+  auto LookupRes = Class->noload_lookup(Name);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(Name);
+  // Test is disabled because this result is 2.
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  ASSERT_EQ(DeclCounter().match(ToTU, FunctionPattern), 2u);
+  To0 = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  auto *To1 = LastDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  EXPECT_FALSE(To1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(To1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, LookupWithProtoBefore) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU =
+  getTuDecl("void f();"
+"struct X { friend void f(); };",
+Lang_CXX, "input0.cc");
+  auto *From0 = FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *From1 = LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_FALSE(From0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  {
+auto Name = From0->getDeclName();
+auto *Class = FirstDe

[PATCH] D49798: [ASTImporter] Adding some friend function related unittests.

2018-08-16 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 160972.
balazske added a comment.

- Renamed variables, corrected a variable type.


Repository:
  rC Clang

https://reviews.llvm.org/D49798

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2275,6 +2275,211 @@
   EXPECT_EQ(ImportedD1->getPreviousDecl(), ImportedD);
 }
 
+TEST_P(ImportFriendFunctions, Lookup) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU =
+  getTuDecl("struct X { friend void f(); };", Lang_CXX, "input0.cc");
+  auto *FromD = FirstDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  {
+auto FromName = FromD->getDeclName();
+auto *Class = FirstDeclMatcher().match(FromTU, ClassPattern);
+auto LookupRes = Class->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 0u);
+LookupRes = FromTU->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 1u);
+  }
+
+  auto *ToD = cast(Import(FromD, Lang_CXX));
+  auto ToName = ToD->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *Class = FirstDeclMatcher().match(ToTU, ClassPattern);
+  auto LookupRes = Class->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  EXPECT_EQ(DeclCounter().match(ToTU, FunctionPattern), 1u);
+  auto *To0 = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, DISABLED_LookupWithProtoAfter) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU = getTuDecl(
+  "struct X { friend void f(); };"
+  // This proto decl makes f available to normal
+  // lookup, otherwise it is hidden.
+  // Normal C++ lookup (implemented in
+  // `clang::Sema::CppLookupName()` and in `LookupDirect()`)
+  // returns the found `NamedDecl` only if the set IDNS is matched
+  "void f();",
+  Lang_CXX, "input0.cc");
+  auto *FromFriend =
+  FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *FromNormal =
+  LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(FromNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+
+  auto FromName = FromFriend->getDeclName();
+  auto *FromClass =
+  FirstDeclMatcher().match(FromTU, ClassPattern);
+  auto LookupRes = FromClass->noload_lookup(FromName);
+  ASSERT_EQ(LookupRes.size(), 0u);
+  LookupRes = FromTU->noload_lookup(FromName);
+  ASSERT_EQ(LookupRes.size(), 1u);
+
+  auto *ToFriend = cast(Import(FromFriend, Lang_CXX));
+  auto ToName = ToFriend->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *ToClass = FirstDeclMatcher().match(ToTU, ClassPattern);
+  LookupRes = ToClass->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(ToName);
+  // Test is disabled because this result is 2.
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  ASSERT_EQ(DeclCounter().match(ToTU, FunctionPattern), 2u);
+  ToFriend = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  auto *ToNormal = LastDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(ToFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(ToFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  EXPECT_FALSE(ToNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(ToNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, LookupWithProtoBefore) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU = getTuDecl(
+  "void f();"
+  "struct X { friend void f(); };",
+  Lang_CXX, "input0.cc");
+  auto *FromNormal =
+  FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *FromFriend =
+  LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(FromNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl:

[PATCH] D49798: [ASTImporter] Adding some friend function related unittests.

2018-08-21 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC340277: [ASTImporter] Adding some friend function related 
unittests. (authored by balazske, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D49798?vs=160972&id=161715#toc

Repository:
  rC Clang

https://reviews.llvm.org/D49798

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2274,6 +2274,211 @@
   EXPECT_EQ(ImportedD1->getPreviousDecl(), ImportedD);
 }
 
+TEST_P(ImportFriendFunctions, Lookup) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU =
+  getTuDecl("struct X { friend void f(); };", Lang_CXX, "input0.cc");
+  auto *FromD = FirstDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  {
+auto FromName = FromD->getDeclName();
+auto *Class = FirstDeclMatcher().match(FromTU, ClassPattern);
+auto LookupRes = Class->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 0u);
+LookupRes = FromTU->noload_lookup(FromName);
+ASSERT_EQ(LookupRes.size(), 1u);
+  }
+
+  auto *ToD = cast(Import(FromD, Lang_CXX));
+  auto ToName = ToD->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *Class = FirstDeclMatcher().match(ToTU, ClassPattern);
+  auto LookupRes = Class->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  EXPECT_EQ(DeclCounter().match(ToTU, FunctionPattern), 1u);
+  auto *To0 = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, DISABLED_LookupWithProtoAfter) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU = getTuDecl(
+  "struct X { friend void f(); };"
+  // This proto decl makes f available to normal
+  // lookup, otherwise it is hidden.
+  // Normal C++ lookup (implemented in
+  // `clang::Sema::CppLookupName()` and in `LookupDirect()`)
+  // returns the found `NamedDecl` only if the set IDNS is matched
+  "void f();",
+  Lang_CXX, "input0.cc");
+  auto *FromFriend =
+  FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *FromNormal =
+  LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_FALSE(FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(FromNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+
+  auto FromName = FromFriend->getDeclName();
+  auto *FromClass =
+  FirstDeclMatcher().match(FromTU, ClassPattern);
+  auto LookupRes = FromClass->noload_lookup(FromName);
+  ASSERT_EQ(LookupRes.size(), 0u);
+  LookupRes = FromTU->noload_lookup(FromName);
+  ASSERT_EQ(LookupRes.size(), 1u);
+
+  auto *ToFriend = cast(Import(FromFriend, Lang_CXX));
+  auto ToName = ToFriend->getDeclName();
+
+  TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  auto *ToClass = FirstDeclMatcher().match(ToTU, ClassPattern);
+  LookupRes = ToClass->noload_lookup(ToName);
+  EXPECT_EQ(LookupRes.size(), 0u);
+  LookupRes = ToTU->noload_lookup(ToName);
+  // Test is disabled because this result is 2.
+  EXPECT_EQ(LookupRes.size(), 1u);
+
+  ASSERT_EQ(DeclCounter().match(ToTU, FunctionPattern), 2u);
+  ToFriend = FirstDeclMatcher().match(ToTU, FunctionPattern);
+  auto *ToNormal = LastDeclMatcher().match(ToTU, FunctionPattern);
+  EXPECT_TRUE(ToFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_FALSE(ToFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  EXPECT_FALSE(ToNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(ToNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, LookupWithProtoBefore) {
+  auto FunctionPattern = functionDecl(hasName("f"));
+  auto ClassPattern = cxxRecordDecl(hasName("X"));
+
+  TranslationUnitDecl *FromTU = getTuDecl(
+  "void f();"
+  "struct X { friend void f(); };",
+  Lang_CXX, "input0.cc");
+  auto *FromNormal =
+  FirstDeclMatcher().match(FromTU, FunctionPattern);
+  auto *FromFriend =
+  LastDeclMatcher().match(FromTU, FunctionPattern);
+  ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(FromNormal->isInIdentifierNamesp

[PATCH] D47313: [ASTImporter] Corrected lookup at import of templated record decl

2018-05-24 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

When a CXXRecordDecl under ClassTemplateDecl is imported, check
the templated record decl for similarity instead of the template.


Repository:
  rC Clang

https://reviews.llvm.org/D47313

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


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1139,6 +1139,50 @@
  has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) {
+  Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
+  auto From =
+  FirstDeclMatcher().match(FromTU, classTemplateDecl());
+  ASSERT_TRUE(From);
+  auto To = cast(Import(From, Lang_CXX));
+  ASSERT_TRUE(To);
+  Decl *ToTemplated = To->getTemplatedDecl();
+  Decl *ToTemplated1 = Import(From->getTemplatedDecl(), Lang_CXX);
+  EXPECT_TRUE(ToTemplated1);
+  EXPECT_EQ(ToTemplated1, ToTemplated);
+}
+
+TEST_P(ASTImporterTestBase, ImportCorrectTemplatedDecl) {
+  auto Code =
+R"(
+namespace x {
+  template struct S1{};
+  template struct S2{};
+  template struct S3{};
+}
+)";
+  Decl *FromTU = getTuDecl(Code, Lang_CXX);
+  auto FromNs =
+  FirstDeclMatcher().match(FromTU, namespaceDecl());
+  auto ToNs = cast(Import(FromNs, Lang_CXX));
+  ASSERT_TRUE(ToNs);
+  auto From =
+  FirstDeclMatcher().match(FromTU,
+  classTemplateDecl(
+  hasName("S2")));
+  auto To =
+  FirstDeclMatcher().match(ToNs,
+  classTemplateDecl(
+  hasName("S2")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(To);
+  auto ToTemplated = To->getTemplatedDecl();
+  auto ToTemplated1 =
+  cast(Import(From->getTemplatedDecl(), Lang_CXX));
+  EXPECT_TRUE(ToTemplated1);
+  ASSERT_EQ(ToTemplated1, ToTemplated);
+}
+
 TEST_P(ASTImporterTestBase, DISABLED_ImportFunctionWithBackReferringParameter) 
{
   Decl *From, *To;
   std::tie(From, To) = getImportedDecl(
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2009,7 +2009,14 @@
 if (const auto *Tag = Typedef->getUnderlyingType()->getAs())
   Found = Tag->getDecl();
   }
-  
+
+  if (D->getDescribedTemplate()) {
+if (auto *Template = dyn_cast(Found))
+  Found = Template->getTemplatedDecl();
+else
+  continue;
+  }
+
   if (auto *FoundRecord = dyn_cast(Found)) {
 if (!SearchName) {
   // If both unnamed structs/unions are in a record context, make sure


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1139,6 +1139,50 @@
  has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) {
+  Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
+  auto From =
+  FirstDeclMatcher().match(FromTU, classTemplateDecl());
+  ASSERT_TRUE(From);
+  auto To = cast(Import(From, Lang_CXX));
+  ASSERT_TRUE(To);
+  Decl *ToTemplated = To->getTemplatedDecl();
+  Decl *ToTemplated1 = Import(From->getTemplatedDecl(), Lang_CXX);
+  EXPECT_TRUE(ToTemplated1);
+  EXPECT_EQ(ToTemplated1, ToTemplated);
+}
+
+TEST_P(ASTImporterTestBase, ImportCorrectTemplatedDecl) {
+  auto Code =
+R"(
+namespace x {
+  template struct S1{};
+  template struct S2{};
+  template struct S3{};
+}
+)";
+  Decl *FromTU = getTuDecl(Code, Lang_CXX);
+  auto FromNs =
+  FirstDeclMatcher().match(FromTU, namespaceDecl());
+  auto ToNs = cast(Import(FromNs, Lang_CXX));
+  ASSERT_TRUE(ToNs);
+  auto From =
+  FirstDeclMatcher().match(FromTU,
+  classTemplateDecl(
+  hasName("S2")));
+  auto To =
+  FirstDeclMatcher().match(ToNs,
+  classTemplateDecl(
+  hasName("S2")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(To);
+  auto ToTemplated = To->getTemplatedDecl();
+  auto ToTemplated1 =
+  cast(Import(From->getTemplatedDecl(), Lang_CXX));
+  EXPECT_TRUE(ToTemplated1);
+  ASSERT_EQ(ToTemplated1, ToTemplated);
+}
+
 TEST_P(ASTImporterTestBase, DISABLED_ImportFunctionWithBackReferringParameter) {
   Decl *From, *To;
   std::tie(From, To) = getImportedDecl(
Index: lib/AST/ASTImporter.

[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-05-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

ASTImporter tests may produce source file related warnings, the diagnostic
client should be in correct state to handle it. Added 'beginSourceFile' to set
the client state.


Repository:
  rC Clang

https://reviews.llvm.org/D47445

Files:
  include/clang/Frontend/ASTUnit.h
  lib/Frontend/ASTUnit.cpp
  unittests/AST/ASTImporterTest.cpp


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -98,6 +98,9 @@
   ASTContext &FromCtx = FromAST->getASTContext(),
   &ToCtx = ToAST->getASTContext();
 
+  FromAST->beginSourceFile();
+  ToAST->beginSourceFile();
+
   ASTImporter Importer(ToCtx, ToAST->getFileManager(),
FromCtx, FromAST->getFileManager(), false);
 
@@ -172,7 +175,9 @@
 : Code(Code), FileName(FileName),
   Unit(tooling::buildASTFromCodeWithArgs(this->Code, Args,
  this->FileName)),
-  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {}
+  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {
+  Unit->beginSourceFile();
+}
   };
 
   // We may have several From contexts and related translation units. In each
@@ -214,6 +219,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->beginSourceFile();
 
 ASTContext &FromCtx = FromTU.Unit->getASTContext(),
&ToCtx = ToAST->getASTContext();
@@ -261,6 +267,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->beginSourceFile();
 
 return ToAST->getASTContext().getTranslationUnitDecl();
   }
@@ -274,6 +281,7 @@
   // Build the AST from an empty file.
   ToAST =
   tooling::buildASTFromCodeWithArgs(/*Code=*/"", ToArgs, "empty.cc");
+  ToAST->beginSourceFile();
 }
 
 // Create a virtual file in the To Ctx which corresponds to the file from
Index: lib/Frontend/ASTUnit.cpp
===
--- lib/Frontend/ASTUnit.cpp
+++ lib/Frontend/ASTUnit.cpp
@@ -274,6 +274,12 @@
   this->PP = std::move(PP);
 }
 
+void ASTUnit::beginSourceFile() {
+  assert(getDiagnostics().getClient() && PP && Ctx &&
+  "Bad context for source file");
+  getDiagnostics().getClient()->BeginSourceFile(Ctx->getLangOpts(), PP.get());
+}
+
 /// Determine the set of code-completion contexts in which this
 /// declaration should be shown.
 static unsigned getDeclShowContexts(const NamedDecl *ND,
Index: include/clang/Frontend/ASTUnit.h
===
--- include/clang/Frontend/ASTUnit.h
+++ include/clang/Frontend/ASTUnit.h
@@ -438,6 +438,8 @@
   void setASTContext(ASTContext *ctx) { Ctx = ctx; }
   void setPreprocessor(std::shared_ptr pp);
 
+  void beginSourceFile();
+
   bool hasSema() const { return (bool)TheSema; }
 
   Sema &getSema() const { 


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -98,6 +98,9 @@
   ASTContext &FromCtx = FromAST->getASTContext(),
   &ToCtx = ToAST->getASTContext();
 
+  FromAST->beginSourceFile();
+  ToAST->beginSourceFile();
+
   ASTImporter Importer(ToCtx, ToAST->getFileManager(),
FromCtx, FromAST->getFileManager(), false);
 
@@ -172,7 +175,9 @@
 : Code(Code), FileName(FileName),
   Unit(tooling::buildASTFromCodeWithArgs(this->Code, Args,
  this->FileName)),
-  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {}
+  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {
+  Unit->beginSourceFile();
+}
   };
 
   // We may have several From contexts and related translation units. In each
@@ -214,6 +219,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->beginSourceFile();
 
 ASTContext &FromCtx = FromTU.Unit->getASTContext(),
&ToCtx = ToAST->getASTContext();
@@ -261,6 +267,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->beginSourceFile();
 
 return ToAST->getASTContext().getTranslationUnitDecl();
   }
@@ -274,6 +281,7 @@
   // Build the AST from an empty file.
   ToAST =
   tooling::buildASTFromCodeWithArgs(/*Code=*/"", ToArgs, "empty.cc");
+  ToAST->beginSourceFile();
 }
 
 // Create a virtual file in the To Ctx which corresponds to the file from
Index: lib/Frontend/ASTUnit.cpp

[PATCH] D47450: [ASTImporter] Use InjectedClassNameType at import of templated record.

2018-05-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

At import of a record describing a template set its type to
InjectedClassNameType (instead of RecordType).


Repository:
  rC Clang

https://reviews.llvm.org/D47450

Files:
  lib/AST/ASTImporter.cpp
  test/ASTMerge/injected-class-name-decl-1/Inputs/inject1.cpp
  test/ASTMerge/injected-class-name-decl-1/test.cpp
  test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
  test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
  test/ASTMerge/injected-class-name-decl/test.cpp

Index: test/ASTMerge/injected-class-name-decl/test.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -std=c++1z -emit-pch -o %t.ast %S/Inputs/inject1.cpp
+// RUN: %clang_cc1 -std=c++1z -emit-obj -o /dev/null -ast-merge %t.ast %S/Inputs/inject2.cpp
+// expected-no-diagnostics
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
@@ -0,0 +1 @@
+template X C::x;
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
@@ -0,0 +1 @@
+template class C { static X x; };
Index: test/ASTMerge/injected-class-name-decl-1/test.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl-1/test.cpp
@@ -0,0 +1,6 @@
+// Trigger a case when at import of template record and replacing its type
+// with InjectedClassNameType there is a PrevDecl of the record.
+
+// RUN: %clang_cc1 -std=c++1z -emit-pch -o %t.ast %S/Inputs/inject1.cpp
+// RUN: %clang_cc1 -std=c++1z -fsyntax-only -ast-merge %t.ast %s
+// expected-no-diagnostics
Index: test/ASTMerge/injected-class-name-decl-1/Inputs/inject1.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl-1/Inputs/inject1.cpp
@@ -0,0 +1,43 @@
+namespace a {
+template  struct b;
+template  struct c;
+template  using e = d;
+class f;
+} // namespace a
+namespace google {
+namespace protobuf {
+namespace internal {
+class LogMessage {
+  LogMessage &operator<<(const char *);
+};
+} // namespace internal
+} // namespace protobuf
+} // namespace google
+namespace a {
+template  class g;
+namespace i {
+struct h;
+template  struct F;
+struct G;
+template  struct j;
+using k = g;
+template  struct l {};
+} // namespace i
+} // namespace a
+namespace a {
+using n = c>;
+template  class g : i::F>> {
+  template  friend struct i::l;
+};
+} // namespace a
+namespace a {
+using i::G;
+}
+namespace google {
+namespace protobuf {
+namespace internal {
+LogMessage &LogMessage::operator<<(const char *) { return *this; }
+a::f *o;
+} // namespace internal
+} // namespace protobuf
+} // namespace google
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2128,6 +2128,29 @@
 if (!ToDescribed)
   return nullptr;
 D2CXX->setDescribedClassTemplate(ToDescribed);
+if (!DCXX->isInjectedClassName()) {
+  // In a record describing a template the type should be a
+  // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
+  // previously set type to the correct value here (ToDescribed is not
+  // available at record create).
+  // FIXME: The previous type is cleared but not removed from
+  // ASTContext's internal storage.
+  CXXRecordDecl *Injected = nullptr;
+  for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
+auto *Record = dyn_cast(Found);
+if (Record && Record->isInjectedClassName()) {
+  Injected = Record;
+  break;
+}
+  }
+  D2CXX->setTypeForDecl(nullptr);
+  Importer.getToContext().getInjectedClassNameType(D2CXX,
+  ToDescribed->getInjectedClassNameSpecialization());
+  if (Injected) {
+Injected->setTypeForDecl(nullptr);
+Importer.getToContext().getTypeDeclType(Injected, D2CXX);
+  }
+}
   } else if (MemberSpecializationInfo *MemberInfo =
DCXX->getMemberSpecializationInfo()) {
 TemplateSpecializationKind SK =
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D47450: [ASTImporter] Use InjectedClassNameType at import of templated record.

2018-05-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:2139
+  CXXRecordDecl *Injected = nullptr;
+  for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
+auto *Record = dyn_cast(Found);

r.stahl wrote:
> The only thing I'm wondering is whether the Decls looked up here are always 
> known to be already imported.
These are in the 'To' context. It may be that the `Injected` is not found here, 
probably because not yet imported (in this case the import may be part of a not 
completed recursive process).


Repository:
  rC Clang

https://reviews.llvm.org/D47450



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


[PATCH] D47459: [ASTImporter] Eliminated some unittest warnings.

2018-05-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: a.sidorin.

When running the ASTTests test, warnings produced by the compiler can be
distracting when looking for test errors. A part of the warnings is removed
by setting extra compiler options.


Repository:
  rC Clang

https://reviews.llvm.org/D47459

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -151,6 +151,25 @@
  Verifier, AMatcher));
 }
 
+template
+void testImport(const std::string &FromCode,
+Language FromLang, const ArgVector &FromArgsExtra,
+const std::string &ToCode,
+Language ToLang, const ArgVector &ToArgsExtra,
+MatchVerifier &Verifier,
+const MatcherType &AMatcher) {
+  auto RunOptsFrom = getRunOptionsForLanguage(FromLang);
+  auto RunOptsTo = getRunOptionsForLanguage(ToLang);
+  for (auto FromArgs : RunOptsFrom) {
+for (auto ToArgs : RunOptsTo) {
+  FromArgs.insert(FromArgs.end(), FromArgsExtra.begin(), FromArgsExtra.end());
+  ToArgs.insert(ToArgs.end(), ToArgsExtra.begin(), ToArgsExtra.end());
+  EXPECT_TRUE(testImport(FromCode, FromArgs, ToCode, ToArgs,
+ Verifier, AMatcher));
+}
+  }
+}
+
 // This class provides generic methods to write tests which can check internal
 // attributes of AST nodes like getPreviousDecl(), isVirtual(), etc.  Also,
 // this fixture makes it possible to import from several "From" contexts.
@@ -428,25 +447,25 @@
 TEST(ImportExpr, ImportStringLiteral) {
   MatchVerifier Verifier;
   testImport("void declToImport() { \"foo\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-Wno-unused-value" }, "", Lang_CXX, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
has(
  stringLiteral(
hasType(
  asString("const char [4]";
   testImport("void declToImport() { L\"foo\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-Wno-unused-value" }, "", Lang_CXX, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
has(
  stringLiteral(
hasType(
 asString("const wchar_t [4]";
   testImport("void declToImport() { \"foo\" \"bar\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-Wno-unused-value" }, "", Lang_CXX, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
@@ -459,7 +478,7 @@
 TEST(ImportExpr, ImportGNUNullExpr) {
   MatchVerifier Verifier;
   testImport("void declToImport() { __null; }",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-Wno-unused-value" }, "", Lang_CXX, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
@@ -471,7 +490,7 @@
 TEST(ImportExpr, ImportCXXNullPtrLiteralExpr) {
   MatchVerifier Verifier;
   testImport("void declToImport() { nullptr; }",
- Lang_CXX11, "", Lang_CXX11, Verifier,
+ Lang_CXX11, { "-Wno-unused-value" }, "", Lang_CXX11, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
@@ -483,16 +502,16 @@
 TEST(ImportExpr, ImportFloatinglLiteralExpr) {
   MatchVerifier Verifier;
   testImport("void declToImport() { 1.0; }",
- Lang_C, "", Lang_C, Verifier,
+ Lang_C, { "-Wno-unused-value" }, "", Lang_C, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
has(
  floatLiteral(
equals(1.0),
hasType(asString("double";
   testImport("void declToImport() { 1.0e-5f; }",
-  Lang_C, "", Lang_C, Verifier,
+  Lang_C, { "-Wno-unused-value" }, "", Lang_C, {}, Verifier,
   functionDecl(
 hasBody(
   compoundStmt(
@@ -507,7 +526,7 @@
   testImport("void declToImport() {"
  "  struct s { int x; long y; unsigned z; }; "
  "  (struct s){ 42, 0L, 1U }; }",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-Wno-unused-value" }, "", Lang_CXX, {}, Verifier,
  functionDecl(
hasBody(
  compoundStmt(
@@ -529,7 +548,7 @@
 TEST(ImportExpr, ImportCXXThisExpr) {
   MatchVerifier Verifier;
   testImport("class declToImport { void f() { this; } };",
- Lang_CXX, "", Lang_CXX, Verifier,
+ Lang_CXX, { "-W

[PATCH] D47459: [ASTImporter] Eliminated some unittest warnings.

2018-05-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Original idea was to not modify the test code to keep it as simple as possible. 
If you like it better I will change the test code.


Repository:
  rC Clang

https://reviews.llvm.org/D47459



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


[PATCH] D47313: [ASTImporter] Corrected lookup at import of templated record decl

2018-05-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Yes, I have no commit permissions.


Repository:
  rC Clang

https://reviews.llvm.org/D47313



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


[PATCH] D49293: [ASTImporter] Add support for import of CXXInheritedCtorInitExpr.

2018-07-25 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC337898: [ASTImporter] Add support for import of 
CXXInheritedCtorInitExpr. (authored by balazske, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D49293?vs=155838&id=157212#toc

Repository:
  rC Clang

https://reviews.llvm.org/D49293

Files:
  lib/AST/ASTImporter.cpp
  test/Import/inherited-ctor-init-expr/Inputs/A.cpp
  test/Import/inherited-ctor-init-expr/test.cpp


Index: test/Import/inherited-ctor-init-expr/Inputs/A.cpp
===
--- test/Import/inherited-ctor-init-expr/Inputs/A.cpp
+++ test/Import/inherited-ctor-init-expr/Inputs/A.cpp
@@ -0,0 +1,11 @@
+class A {
+public:
+  A(int a) : a(a) {}
+  int a;
+};
+class B : public A {
+  using A::A;
+};
+class C : public B {
+  C() : B(1) {}
+};
Index: test/Import/inherited-ctor-init-expr/test.cpp
===
--- test/Import/inherited-ctor-init-expr/test.cpp
+++ test/Import/inherited-ctor-init-expr/test.cpp
@@ -0,0 +1,6 @@
+// RUN: clang-import-test -dump-ast -expression=%s -import=%S/Inputs/A.cpp | 
FileCheck %s
+// CHECK: | | | `-CXXInheritedCtorInitExpr
+
+void foo() {
+  C c;
+}
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -460,6 +460,7 @@
 Expr *VisitLambdaExpr(LambdaExpr *LE);
 Expr *VisitInitListExpr(InitListExpr *E);
 Expr *VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
+Expr *VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
 Expr *VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
 Expr *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
 Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
@@ -6772,6 +6773,22 @@
   return new (Importer.getToContext()) CXXStdInitializerListExpr(T, SE);
 }
 
+Expr *ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
+CXXInheritedCtorInitExpr *E) {
+  QualType T = Importer.Import(E->getType());
+  if (T.isNull())
+return nullptr;
+
+  auto *Ctor = cast_or_null(Importer.Import(
+  E->getConstructor()));
+  if (!Ctor)
+return nullptr;
+
+  return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
+  Importer.Import(E->getLocation()), T, Ctor,
+  E->constructsVBase(), E->inheritedFromVBase());
+}
+
 Expr *ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
   QualType ToType = Importer.Import(E->getType());
   if (ToType.isNull())


Index: test/Import/inherited-ctor-init-expr/Inputs/A.cpp
===
--- test/Import/inherited-ctor-init-expr/Inputs/A.cpp
+++ test/Import/inherited-ctor-init-expr/Inputs/A.cpp
@@ -0,0 +1,11 @@
+class A {
+public:
+  A(int a) : a(a) {}
+  int a;
+};
+class B : public A {
+  using A::A;
+};
+class C : public B {
+  C() : B(1) {}
+};
Index: test/Import/inherited-ctor-init-expr/test.cpp
===
--- test/Import/inherited-ctor-init-expr/test.cpp
+++ test/Import/inherited-ctor-init-expr/test.cpp
@@ -0,0 +1,6 @@
+// RUN: clang-import-test -dump-ast -expression=%s -import=%S/Inputs/A.cpp | FileCheck %s
+// CHECK: | | | `-CXXInheritedCtorInitExpr
+
+void foo() {
+  C c;
+}
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -460,6 +460,7 @@
 Expr *VisitLambdaExpr(LambdaExpr *LE);
 Expr *VisitInitListExpr(InitListExpr *E);
 Expr *VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
+Expr *VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
 Expr *VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
 Expr *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
 Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
@@ -6772,6 +6773,22 @@
   return new (Importer.getToContext()) CXXStdInitializerListExpr(T, SE);
 }
 
+Expr *ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
+CXXInheritedCtorInitExpr *E) {
+  QualType T = Importer.Import(E->getType());
+  if (T.isNull())
+return nullptr;
+
+  auto *Ctor = cast_or_null(Importer.Import(
+  E->getConstructor()));
+  if (!Ctor)
+return nullptr;
+
+  return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
+  Importer.Import(E->getLocation()), T, Ctor,
+  E->constructsVBase(), E->inheritedFromVBase());
+}
+
 Expr *ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
   QualType ToType = Importer.Import(E->getType());
   if (ToType.isNull())
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D49796: [ASTImporter] Load external Decls when getting field index.

2018-07-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

At equality check of fields without name the index of fields is compared.
At determining the index of a field all fields of the parent context
should be loaded from external source to find the field at all.


Repository:
  rC Clang

https://reviews.llvm.org/D49796

Files:
  lib/AST/ASTImporter.cpp
  test/ASTMerge/unnamed_fields/Inputs/il.cpp
  test/ASTMerge/unnamed_fields/test.cpp
  unittests/AST/ASTImporterTest.cpp


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2612,6 +2612,45 @@
   R1, recordDecl(has(fieldDecl(hasName("next"));
 }
 
+TEST_P(ASTImporterTestBase, ImportUnnamedFieldsInCorrectOrder) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  void f(int X, int Y, bool Z) {
+(void)[X, Y, Z] { (void)Z; };
+  }
+  )",
+  Lang_CXX11, "input0.cc");
+  auto *FromF = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  auto *ToF = cast_or_null(Import(FromF, Lang_CXX11));
+  EXPECT_TRUE(ToF);
+
+  CXXRecordDecl *FromLambda =
+  cast(cast(cast(
+  FromF->getBody())->body_front())->getSubExpr())->getLambdaClass();
+
+  auto *ToLambda = cast_or_null(Import(FromLambda, Lang_CXX11));
+  EXPECT_TRUE(ToLambda);
+
+  // Check if the fields of the lambda class are imported in correct order.
+  unsigned FromIndex = 0u;
+  for (auto *FromField : FromLambda->fields()) {
+ASSERT_FALSE(FromField->getDeclName());
+auto *ToField = cast_or_null(Import(FromField, Lang_CXX11));
+EXPECT_TRUE(ToField);
+unsigned ToIndex = 0u;
+for (auto *F : ToLambda->fields()) {
+  if (F == ToField)
+break;
+  ++ToIndex;
+}
+EXPECT_EQ(ToIndex, FromIndex);
+++FromIndex;
+  }
+
+  EXPECT_EQ(FromIndex, 3u);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: test/ASTMerge/unnamed_fields/test.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/il.cpp
+// RUN: %clang_cc1 -ast-merge %t.1.ast -fsyntax-only %s 2>&1 | FileCheck 
--allow-empty %s
+// CHECK-NOT: warning: field '' declared with incompatible types in different 
translation units ('bool' vs. 'int')
Index: test/ASTMerge/unnamed_fields/Inputs/il.cpp
===
--- /dev/null
+++ test/ASTMerge/unnamed_fields/Inputs/il.cpp
@@ -0,0 +1,3 @@
+void f(int X, int Y, bool Z) {
+  auto x = [X, Y, Z] { (void)Z; };
+}
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2829,15 +2829,17 @@
 return 0;
 
   unsigned Index = 1;
-  for (const auto *D : Owner->noload_decls()) {
+  for (const auto *D : Owner->decls()) {
 if (D == F)
   return Index;
 
 if (isa(*D) || isa(*D))
   ++Index;
   }
 
-  return Index;
+  assert(false && "Field was not found in its parent context.");
+
+  return 0;
 }
 
 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2612,6 +2612,45 @@
   R1, recordDecl(has(fieldDecl(hasName("next"));
 }
 
+TEST_P(ASTImporterTestBase, ImportUnnamedFieldsInCorrectOrder) {
+  Decl *FromTU = getTuDecl(
+  R"(
+  void f(int X, int Y, bool Z) {
+(void)[X, Y, Z] { (void)Z; };
+  }
+  )",
+  Lang_CXX11, "input0.cc");
+  auto *FromF = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  auto *ToF = cast_or_null(Import(FromF, Lang_CXX11));
+  EXPECT_TRUE(ToF);
+
+  CXXRecordDecl *FromLambda =
+  cast(cast(cast(
+  FromF->getBody())->body_front())->getSubExpr())->getLambdaClass();
+
+  auto *ToLambda = cast_or_null(Import(FromLambda, Lang_CXX11));
+  EXPECT_TRUE(ToLambda);
+
+  // Check if the fields of the lambda class are imported in correct order.
+  unsigned FromIndex = 0u;
+  for (auto *FromField : FromLambda->fields()) {
+ASSERT_FALSE(FromField->getDeclName());
+auto *ToField = cast_or_null(Import(FromField, Lang_CXX11));
+EXPECT_TRUE(ToField);
+unsigned ToIndex = 0u;
+for (auto *F : ToLambda->fields()) {
+  if (F == ToField)
+break;
+  ++ToIndex;
+}
+EXPECT_EQ(ToIndex, FromIndex);
+++FromIndex;
+  }
+
+  EXPECT_EQ(FromIndex, 3u);
+}
+
 struct DeclContextTest : ASTImporterTestBase {};
 
 TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
Index: test/ASTMerge/unnamed_fields/test.cpp

[PATCH] D49798: [ASTImporter] Adding some friend function related unittests.

2018-07-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, martong.
Herald added a reviewer: a.sidorin.

Repository:
  rC Clang

https://reviews.llvm.org/D49798

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -2241,6 +2241,217 @@
   EXPECT_EQ(ImportedD1->getPreviousDecl(), ImportedD);
 }
 
+TEST_P(ImportFriendFunctions, Lookup) {
+  auto Pattern = functionDecl(hasName("f"));
+
+  Decl *FromTU =
+  getTuDecl("struct X { friend void f(); };", Lang_CXX, "input0.cc");
+  auto FromD = FirstDeclMatcher().match(FromTU, Pattern);
+  ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(!FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  auto FromName = FromD->getDeclName();
+  {
+CXXRecordDecl *Class =
+FirstDeclMatcher().match(FromTU, cxxRecordDecl());
+auto lookup_res = Class->noload_lookup(FromName);
+ASSERT_EQ(lookup_res.size(), 0u);
+lookup_res = cast(FromTU)->noload_lookup(FromName);
+ASSERT_EQ(lookup_res.size(), 1u);
+  }
+
+  auto ToD = cast(Import(FromD, Lang_CXX));
+  auto ToName = ToD->getDeclName();
+
+  {
+Decl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+CXXRecordDecl *Class =
+FirstDeclMatcher().match(ToTU, cxxRecordDecl());
+auto lookup_res = Class->noload_lookup(ToName);
+EXPECT_EQ(lookup_res.size(), 0u);
+lookup_res = cast(ToTU)->noload_lookup(ToName);
+EXPECT_EQ(lookup_res.size(), 1u);
+  }
+
+  Decl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  ASSERT_EQ(DeclCounter().match(ToTU, Pattern), 1u);
+  auto To0 = FirstDeclMatcher().match(ToTU, Pattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(!To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, DISABLED_LookupWithProto) {
+  auto Pattern = functionDecl(hasName("f"));
+
+  Decl *FromTU =
+  getTuDecl("struct X { friend void f(); };"
+// This proto decl makes f available to normal
+// lookup, otherwise it is hidden.
+// Normal C++ lookup (implemented in
+// `clang::Sema::CppLookupName()` and in `LookupDirect()`)
+// returns the found `NamedDecl` only if the set IDNS is matched
+"void f();",
+Lang_CXX, "input0.cc");
+  auto From0 = FirstDeclMatcher().match(FromTU, Pattern);
+  auto From1 = LastDeclMatcher().match(FromTU, Pattern);
+  ASSERT_TRUE(From0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(!From0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_TRUE(!From1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  auto FromName = From0->getDeclName();
+  {
+CXXRecordDecl *Class =
+FirstDeclMatcher().match(FromTU, cxxRecordDecl());
+auto lookup_res = Class->noload_lookup(FromName);
+ASSERT_EQ(lookup_res.size(), 0u);
+lookup_res = cast(FromTU)->noload_lookup(FromName);
+ASSERT_EQ(lookup_res.size(), 1u);
+  }
+
+  auto To0 = cast(Import(From0, Lang_CXX));
+  auto ToName = To0->getDeclName();
+
+  {
+auto ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+CXXRecordDecl *Class =
+FirstDeclMatcher().match(ToTU, cxxRecordDecl());
+auto lookup_res = Class->noload_lookup(ToName);
+EXPECT_EQ(lookup_res.size(), 0u);
+lookup_res = ToTU->noload_lookup(ToName);
+EXPECT_EQ(lookup_res.size(), 1u);
+  }
+
+  auto ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  ASSERT_EQ(DeclCounter().match(ToTU, Pattern), 2u);
+  To0 = FirstDeclMatcher().match(ToTU, Pattern);
+  auto To1 = LastDeclMatcher().match(ToTU, Pattern);
+  EXPECT_TRUE(To0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(!To0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  EXPECT_TRUE(!To1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  EXPECT_TRUE(To1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+}
+
+TEST_P(ImportFriendFunctions, LookupWithProtoFirst) {
+  auto Pattern = functionDecl(hasName("f"));
+
+  Decl *FromTU =
+  getTuDecl("void f();"
+"struct X { friend void f(); };",
+Lang_CXX, "input0.cc");
+  auto From0 = FirstDeclMatcher().match(FromTU, Pattern);
+  auto From1 = LastDeclMatcher().match(FromTU, Pattern);
+  ASSERT_TRUE(!From0->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From0->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
+  ASSERT_TRUE(From1->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+  auto FromName = From0->getDeclName();
+  {
+CXXRecordDecl *Class =
+FirstDeclMatcher().match(FromTU, cxxRecordDecl());
+auto lo

[PATCH] D49223: [AST] Check described template at structural equivalence check.

2018-08-01 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTStructuralEquivalence.cpp:958
 
+  if (D1->isTemplated() != D2->isTemplated())
+return false;

a_sidorin wrote:
> I think we can move the changes for both RecordDecl and FunctionDecl into 
> `Finish()` and use `Decl::getDescribedTemplate()`. This will both simplify 
> the patch and give us the support for templated VarDecls and TypeAliasDecls 
> for free. What do you think?
Yes it can be good to check with `getDescribedClassTemplate` in `Finish`. 
(Similarly, there can be more things that are common to check with all `Decl` 
or `NamedDecl` objects in `Finish`, specifically the name is checked. Or in 
some cases the name does not matter, but in others yes?)


Repository:
  rC Clang

https://reviews.llvm.org/D49223



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


[PATCH] D49223: [AST] Check described template at structural equivalence check.

2018-08-06 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 159279.
balazske added a comment.

- Rebase, common checks at ASTStructuralEquivalenceContext


Repository:
  rC Clang

https://reviews.llvm.org/D49223

Files:
  include/clang/AST/ASTStructuralEquivalence.h
  lib/AST/ASTStructuralEquivalence.cpp
  unittests/AST/StructuralEquivalenceTest.cpp

Index: unittests/AST/StructuralEquivalenceTest.cpp
===
--- unittests/AST/StructuralEquivalenceTest.cpp
+++ unittests/AST/StructuralEquivalenceTest.cpp
@@ -78,11 +78,18 @@
   }
 
   bool testStructuralMatch(Decl *D0, Decl *D1) {
-llvm::DenseSet> NonEquivalentDecls;
-StructuralEquivalenceContext Ctx(
-D0->getASTContext(), D1->getASTContext(), NonEquivalentDecls,
-StructuralEquivalenceKind::Default, false, false);
-return Ctx.IsEquivalent(D0, D1);
+llvm::DenseSet> NonEquivalentDecls01;
+llvm::DenseSet> NonEquivalentDecls10;
+StructuralEquivalenceContext Ctx01(
+D0->getASTContext(), D1->getASTContext(),
+NonEquivalentDecls01, StructuralEquivalenceKind::Default, false, false);
+StructuralEquivalenceContext Ctx10(
+D1->getASTContext(), D0->getASTContext(),
+NonEquivalentDecls10, StructuralEquivalenceKind::Default, false, false);
+bool Eq01 = Ctx01.IsEquivalent(D0, D1);
+bool Eq10 = Ctx10.IsEquivalent(D1, D0);
+EXPECT_EQ(Eq01, Eq10);
+return Eq01;
   }
 
   bool testStructuralMatch(std::tuple t) {
@@ -215,6 +222,14 @@
 struct StructuralEquivalenceFunctionTest : StructuralEquivalenceTest {
 };
 
+TEST_F(StructuralEquivalenceFunctionTest, TemplateVsNonTemplate) {
+  auto t = makeNamedDecls(
+  "void foo();",
+  "template void foo();",
+  Lang_CXX);
+  EXPECT_FALSE(testStructuralMatch(t));
+}
+
 TEST_F(StructuralEquivalenceFunctionTest, ParamConstWithRef) {
   auto t = makeNamedDecls("void foo(int&);",
   "void foo(const int&);", Lang_CXX);
@@ -618,6 +633,14 @@
   EXPECT_FALSE(testStructuralMatch(R0, R1));
 }
 
+TEST_F(StructuralEquivalenceRecordTest, TemplateVsNonTemplate) {
+  auto t = makeDecls(
+  "struct A { };",
+  "template struct A { };",
+  Lang_CXX,
+  cxxRecordDecl(hasName("A")));
+  EXPECT_FALSE(testStructuralMatch(t));
+}
 
 TEST_F(StructuralEquivalenceTest, CompareSameDeclWithMultiple) {
   auto t = makeNamedDecls(
Index: lib/AST/ASTStructuralEquivalence.cpp
===
--- lib/AST/ASTStructuralEquivalence.cpp
+++ lib/AST/ASTStructuralEquivalence.cpp
@@ -1023,7 +1023,7 @@
 return true;
 
   // If any of the records has external storage and we do a minimal check (or
-  // AST import) we assmue they are equivalent. (If we didn't have this
+  // AST import) we assume they are equivalent. (If we didn't have this
   // assumption then `RecordDecl::LoadFieldsFromExternalStorage` could trigger
   // another AST import which in turn would call the structural equivalency
   // check again and finally we'd have an improper result.)
@@ -1497,6 +1497,140 @@
   return !Finish();
 }
 
+bool StructuralEquivalenceContext::CommonCheckAtFinish(Decl *D1, Decl *D2) {
+  // Check for equivalent described template.
+  TemplateDecl *Template1 = D1->getDescribedTemplate();
+  TemplateDecl *Template2 = D2->getDescribedTemplate();
+  if ((Template1 != nullptr) != (Template2 != nullptr))
+return false;
+  if (Template1 && !IsStructurallyEquivalent(*this, Template1, Template2))
+return false;
+
+  // FIXME: Move check for identifier names into this function.
+
+  return true;
+}
+
+bool StructuralEquivalenceContext::SpecialCheckAtFinish(Decl *D1, Decl *D2) {
+  // FIXME: Switch on all declaration kinds. For now, we're just going to
+  // check the obvious ones.
+  if (auto *Record1 = dyn_cast(D1)) {
+if (auto *Record2 = dyn_cast(D2)) {
+  // Check for equivalent structure names.
+  IdentifierInfo *Name1 = Record1->getIdentifier();
+  if (!Name1 && Record1->getTypedefNameForAnonDecl())
+Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Record2->getIdentifier();
+  if (!Name2 && Record2->getTypedefNameForAnonDecl())
+Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
+  if (!::IsStructurallyEquivalent(Name1, Name2) ||
+  !::IsStructurallyEquivalent(*this, Record1, Record2))
+return false;
+} else {
+  // Record/non-record mismatch.
+  return false;
+}
+  } else if (auto *Enum1 = dyn_cast(D1)) {
+if (auto *Enum2 = dyn_cast(D2)) {
+  // Check for equivalent enum names.
+  IdentifierInfo *Name1 = Enum1->getIdentifier();
+  if (!Name1 && Enum1->getTypedefNameForAnonDecl())
+Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
+  IdentifierInfo *Name2 = Enum2->getIdentifier();
+  if (!Name2 && Enum2->getTypedefNameForAnonDecl())
+Name2 = Enum2->getTypedefNameForAnonDe

[PATCH] D47459: [ASTImporter] Eliminated some unittest warnings.

2018-05-30 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 149079.
balazske added a comment.

[ASTImporter] Fixed test code in ASTImporter tests.

Test code is fixed instead of turn off the warnings.
For this to work change of match expressions was needed.


Repository:
  rC Clang

https://reviews.llvm.org/D47459

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -427,117 +427,99 @@
 
 TEST(ImportExpr, ImportStringLiteral) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { \"foo\"; }",
+  testImport("void declToImport() { (void)\"foo\"; }",
  Lang_CXX, "", Lang_CXX, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
- asString("const char [4]";
-  testImport("void declToImport() { L\"foo\"; }",
+   hasDescendant(
+ stringLiteral(
+   hasType(
+ asString("const char [4]"));
+  testImport("void declToImport() { (void)L\"foo\"; }",
  Lang_CXX, "", Lang_CXX, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
-asString("const wchar_t [4]";
-  testImport("void declToImport() { \"foo\" \"bar\"; }",
+   hasDescendant(
+ stringLiteral(
+   hasType(
+ asString("const wchar_t [4]"));
+  testImport("void declToImport() { (void) \"foo\" \"bar\"; }",
  Lang_CXX, "", Lang_CXX, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
- asString("const char [7]";
+   hasDescendant(
+ stringLiteral(
+   hasType(
+ asString("const char [7]"));
 }
 
 TEST(ImportExpr, ImportGNUNullExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { __null; }",
+  testImport("void declToImport() { (void)__null; }",
  Lang_CXX, "", Lang_CXX, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- gnuNullExpr(
-   hasType(isInteger(;
+   hasDescendant(
+ gnuNullExpr(
+   hasType(isInteger());
 }
 
 TEST(ImportExpr, ImportCXXNullPtrLiteralExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { nullptr; }",
+  testImport("void declToImport() { (void)nullptr; }",
  Lang_CXX11, "", Lang_CXX11, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- cxxNullPtrLiteralExpr());
+   hasDescendant(
+ cxxNullPtrLiteralExpr(;
 }
 
 
 TEST(ImportExpr, ImportFloatinglLiteralExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { 1.0; }",
+  testImport("void declToImport() { (void)1.0; }",
  Lang_C, "", Lang_C, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- floatLiteral(
-   equals(1.0),
-   hasType(asString("double";
-  testImport("void declToImport() { 1.0e-5f; }",
+   hasDescendant(
+ floatLiteral(
+   equals(1.0),
+   hasType(asString("double"));
+  testImport("void declToImport() { (void)1.0e-5f; }",
   Lang_C, "", Lang_C, Verifier,
   functionDecl(
-hasBody(
-  compoundStmt(
-has(
-  floatLiteral(
-equals(1.0e-5f),
-hasType(asString("float";
+hasDescendant(
+  floatLiteral(
+equals(1.0e-5f),
+hasType(asString("float"));
 }
 
 TEST(ImportExpr, ImportCompoundLiteralExpr) {
   MatchVerifier Verifier;
   testImport("void declToImport() {"
  "  struct s { int x; long y; unsigned z; }; "
- "  (struct s){ 42, 0L, 1U }; }",
+ "  (void) (struct s){ 42, 0L, 1U }; }",
  Lang_CXX, "", Lang_CXX, Verifier,
  functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- compoundLiteralExpr(
-   hasType(asString("struct s")),
- 

[PATCH] D47367: [ASTImporter] Add ms compatibility to tests

2018-05-30 Thread Balázs Kéri via Phabricator via cfe-commits
balazske accepted this revision.
balazske added a comment.
This revision is now accepted and ready to land.

Found no big problems. But not all extra options are applicable to all 
languages (template related things to C) so there may be redundant tests.


Repository:
  rC Clang

https://reviews.llvm.org/D47367



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


[PATCH] D47450: [ASTImporter] Use InjectedClassNameType at import of templated record.

2018-05-30 Thread Balázs Kéri via Phabricator via cfe-commits
balazske requested review of this revision.
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:2131
 D2CXX->setDescribedClassTemplate(ToDescribed);
+if (!DCXX->isInjectedClassName()) {
+  // In a record describing a template the type should be a

a.sidorin wrote:
> Maybe we should fix it a bit upper (line 2100)?
The `ToDescribed` is used in this code, not available before the new record is 
created.


Repository:
  rC Clang

https://reviews.llvm.org/D47450



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


[PATCH] D47450: [ASTImporter] Use InjectedClassNameType at import of templated record.

2018-05-30 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: test/ASTMerge/injected-class-name-decl-1/Inputs/inject1.cpp:16
+} // namespace google
+namespace a {
+template  class g;

a.sidorin wrote:
> This looks like raw creduce output. Is there a way to simplify this or make 
> human-readable? Do we really need nested namespaces, unused decls and other 
> stuff not removed by creduce? I know that creduce is bad at reducing 
> templates because we often meet similar output internally. But it is usually 
> not a problem to resolve some redundancy manually to assist creduce. In this 
> case, we can start by removing `k` and `n`.
> We can leave this code as-is only if removing declarations or simplifying 
> templates affects import order causing the bug to disappear. But even in this 
> case we have to humanize the test.
Probably remove this test? There was some bug in a previous version of the fix 
that was triggered by this test. Before that fix (and on current master) this 
test does not fail so it is not possible to simplify it.


Repository:
  rC Clang

https://reviews.llvm.org/D47450



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


[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-05-31 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

If `BeginSourceFile` is not called on the diagnostic client object, it is not 
possible to have compiler warnings or errors that come from the "To" context 
while importing something (there is some assertion if a source file related 
warning is to be emitted but no source file is set). In the currently existing 
tests there is no such case but I have not yet committed tests that produce 
such warnings (for example ODR violations during import or encounter of 
unsupported constructs).


Repository:
  rC Clang

https://reviews.llvm.org/D47445



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


[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-05-31 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

The new `ASTUnit::beginSourceFile` is only there to simplify the code. It is 
possible to get `Ctx`, `PP` and `getDiagnostic()` from outside of `ASTUnit` and 
call the same thing, but requires more code to write. Probably a more smart 
place to call `BeginSourceFile` can be found if we look deep into `ASTUnit` and 
`buildAST` functions that generate the AST from code that has associated source 
file but this would be a change that affects more code.


Repository:
  rC Clang

https://reviews.llvm.org/D47445



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


[PATCH] D47532: [ASTImporter] Import the whole redecl chain of functions

2018-05-31 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:88
+  llvm::SmallVector getCanonicalForwardRedeclChain(Decl* D) {
+// Currently only FunctionDecl is supported
+auto FD = cast(D);

Assert for FunctionDecl?



Comment at: unittests/AST/ASTImporterTest.cpp:1745
+TEST_P(ImportFunctions, ImportDefinitions) {
+  auto Pattern = functionDecl(hasName("f"));
+

This test imports the definition two times, the second should result in error. 
The import does not check the function body for similarness. Probably a check 
can be made for the result of the second import.


Repository:
  rC Clang

https://reviews.llvm.org/D47532



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


[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-06-01 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 149412.
balazske added a comment.

- Added comment, renamed beginSourceFile, removed check for PP.

Check for PP is removed because it is allowed to be nullptr.


Repository:
  rC Clang

https://reviews.llvm.org/D47445

Files:
  include/clang/Frontend/ASTUnit.h
  lib/Frontend/ASTUnit.cpp
  unittests/AST/ASTImporterTest.cpp


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -98,6 +98,9 @@
   ASTContext &FromCtx = FromAST->getASTContext(),
   &ToCtx = ToAST->getASTContext();
 
+  FromAST->enableSourceFileDiagnostics();
+  ToAST->enableSourceFileDiagnostics();
+
   ASTImporter Importer(ToCtx, ToAST->getFileManager(),
FromCtx, FromAST->getFileManager(), false);
 
@@ -172,7 +175,9 @@
 : Code(Code), FileName(FileName),
   Unit(tooling::buildASTFromCodeWithArgs(this->Code, Args,
  this->FileName)),
-  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {}
+  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {
+  Unit->enableSourceFileDiagnostics();
+}
   };
 
   // We may have several From contexts and related translation units. In each
@@ -214,6 +219,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->enableSourceFileDiagnostics();
 
 ASTContext &FromCtx = FromTU.Unit->getASTContext(),
&ToCtx = ToAST->getASTContext();
@@ -261,6 +267,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->enableSourceFileDiagnostics();
 
 return ToAST->getASTContext().getTranslationUnitDecl();
   }
@@ -274,6 +281,7 @@
   // Build the AST from an empty file.
   ToAST =
   tooling::buildASTFromCodeWithArgs(/*Code=*/"", ToArgs, "empty.cc");
+  ToAST->enableSourceFileDiagnostics();
 }
 
 // Create a virtual file in the To Ctx which corresponds to the file from
Index: lib/Frontend/ASTUnit.cpp
===
--- lib/Frontend/ASTUnit.cpp
+++ lib/Frontend/ASTUnit.cpp
@@ -274,6 +274,12 @@
   this->PP = std::move(PP);
 }
 
+void ASTUnit::enableSourceFileDiagnostics() {
+  assert(getDiagnostics().getClient() && Ctx &&
+  "Bad context for source file");
+  getDiagnostics().getClient()->BeginSourceFile(Ctx->getLangOpts(), PP.get());
+}
+
 /// Determine the set of code-completion contexts in which this
 /// declaration should be shown.
 static unsigned getDeclShowContexts(const NamedDecl *ND,
Index: include/clang/Frontend/ASTUnit.h
===
--- include/clang/Frontend/ASTUnit.h
+++ include/clang/Frontend/ASTUnit.h
@@ -438,6 +438,15 @@
   void setASTContext(ASTContext *ctx) { Ctx = ctx; }
   void setPreprocessor(std::shared_ptr pp);
 
+  /// Enable source-range based diagnostic messages.
+  ///
+  /// If diagnostic messages with source-range information are to be expected
+  /// and AST comes not from file (e.g. after LoadFromCompilerInvocation) this
+  /// function has to be called.
+  /// The function is to be called only once and the AST should be associated
+  /// with the same source file afterwards.
+  void enableSourceFileDiagnostics();
+
   bool hasSema() const { return (bool)TheSema; }
 
   Sema &getSema() const { 


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -98,6 +98,9 @@
   ASTContext &FromCtx = FromAST->getASTContext(),
   &ToCtx = ToAST->getASTContext();
 
+  FromAST->enableSourceFileDiagnostics();
+  ToAST->enableSourceFileDiagnostics();
+
   ASTImporter Importer(ToCtx, ToAST->getFileManager(),
FromCtx, FromAST->getFileManager(), false);
 
@@ -172,7 +175,9 @@
 : Code(Code), FileName(FileName),
   Unit(tooling::buildASTFromCodeWithArgs(this->Code, Args,
  this->FileName)),
-  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {}
+  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {
+  Unit->enableSourceFileDiagnostics();
+}
   };
 
   // We may have several From contexts and related translation units. In each
@@ -214,6 +219,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, OutputFileName);
+ToAST->enableSourceFileDiagnostics();
 
 ASTContext &FromCtx = FromTU.Unit->getASTContext(),
&ToCtx = ToAST->getASTContext();
@@ -261,6 +267,7 @@
 ToCode = ToSrcCode;
 assert(!ToAST);
 ToAST = tooling::buildASTFromCodeWithArgs(ToCode, ToArgs, Out

[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-06-01 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

From API point of view if there is a `enableSourceFileDiagnostics` there should 
be a `disableSourceFileDiagnostics` too (that calls the `EndSourceFile`). But I 
am not sure how and if to use it at all. In the unit tests it is not needed, 
the ASTUnit contains a single entity for the "To" context.


Repository:
  rC Clang

https://reviews.llvm.org/D47445



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


[PATCH] D47946: [ASTmporter] Fix infinite recursion on function import with struct definition in parameters

2018-06-10 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Problem: This change interferes with https://reviews.llvm.org/D47445. Probably 
that should be committed, it is approved already.


Repository:
  rC Clang

https://reviews.llvm.org/D47946



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


[PATCH] D47445: [ASTImporter] Corrected diagnostic client handling in tests.

2018-06-11 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

I want this change to be committed by somebody. I have no commit right.


Repository:
  rC Clang

https://reviews.llvm.org/D47445



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


[PATCH] D47698: [ASTImporter] import macro source locations

2018-06-22 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: unittests/AST/ASTImporterTest.cpp:1534
+}
+TEST_P(ASTImporterTestBase, ImportSourceLocs) {
+  Decl *FromTU = getTuDecl(

This test causes every case for expansion (macro, macro arg) to be executed at 
import?


Repository:
  rC Clang

https://reviews.llvm.org/D47698



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


[PATCH] D47459: [ASTImporter] Eliminated some unittest warnings.

2018-06-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 152632.
balazske added a comment.

[ASTImporter] Fixed test code in ASTImporter tests.

Reformatted some test code, changed to use isDescendant.


Repository:
  rC Clang

https://reviews.llvm.org/D47459

Files:
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -427,138 +427,110 @@
 
 TEST(ImportExpr, ImportStringLiteral) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { \"foo\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
- asString("const char [4]";
-  testImport("void declToImport() { L\"foo\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
-asString("const wchar_t [4]";
-  testImport("void declToImport() { \"foo\" \"bar\"; }",
- Lang_CXX, "", Lang_CXX, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- stringLiteral(
-   hasType(
- asString("const char [7]";
+  testImport(
+  "void declToImport() { (void)\"foo\"; }",
+  Lang_CXX, "", Lang_CXX, Verifier,
+  functionDecl(hasDescendant(
+  stringLiteral(hasType(asString("const char [4]"));
+  testImport(
+  "void declToImport() { (void)L\"foo\"; }",
+  Lang_CXX, "", Lang_CXX, Verifier,
+  functionDecl(hasDescendant(
+  stringLiteral(hasType(asString("const wchar_t [4]"));
+  testImport(
+  "void declToImport() { (void) \"foo\" \"bar\"; }",
+  Lang_CXX, "", Lang_CXX, Verifier,
+  functionDecl(hasDescendant(
+  stringLiteral(hasType(asString("const char [7]"));
 }
 
 TEST(ImportExpr, ImportGNUNullExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { __null; }",
- Lang_CXX, "", Lang_CXX, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- gnuNullExpr(
-   hasType(isInteger(;
+  testImport(
+  "void declToImport() { (void)__null; }",
+  Lang_CXX, "", Lang_CXX, Verifier,
+  functionDecl(hasDescendant(gnuNullExpr(hasType(isInteger());
 }
 
 TEST(ImportExpr, ImportCXXNullPtrLiteralExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { nullptr; }",
- Lang_CXX11, "", Lang_CXX11, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- cxxNullPtrLiteralExpr());
+  testImport(
+  "void declToImport() { (void)nullptr; }",
+  Lang_CXX11, "", Lang_CXX11, Verifier,
+  functionDecl(hasDescendant(cxxNullPtrLiteralExpr(;
 }
 
 
 TEST(ImportExpr, ImportFloatinglLiteralExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() { 1.0; }",
- Lang_C, "", Lang_C, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- floatLiteral(
-   equals(1.0),
-   hasType(asString("double";
-  testImport("void declToImport() { 1.0e-5f; }",
-  Lang_C, "", Lang_C, Verifier,
-  functionDecl(
-hasBody(
-  compoundStmt(
-has(
-  floatLiteral(
-equals(1.0e-5f),
-hasType(asString("float";
+  testImport(
+  "void declToImport() { (void)1.0; }",
+  Lang_C, "", Lang_C, Verifier,
+  functionDecl(hasDescendant(
+  floatLiteral(equals(1.0), hasType(asString("double"));
+  testImport(
+  "void declToImport() { (void)1.0e-5f; }",
+  Lang_C, "", Lang_C, Verifier,
+  functionDecl(hasDescendant(
+  floatLiteral(equals(1.0e-5f), hasType(asString("float"));
 }
 
 TEST(ImportExpr, ImportCompoundLiteralExpr) {
   MatchVerifier Verifier;
-  testImport("void declToImport() {"
- "  struct s { int x; long y; unsigned z; }; "
- "  (struct s){ 42, 0L, 1U }; }",
- Lang_CXX, "", Lang_CXX, Verifier,
- functionDecl(
-   hasBody(
- compoundStmt(
-   has(
- compoundLiteralExpr(
-   hasType(asString("struct s")),
-   has(initListExpr(
-  

[PATCH] D47459: [ASTImporter] Eliminated some unittest warnings.

2018-06-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske marked 2 inline comments as done.
balazske added a comment.

Some of the source code was reformatted for more consistency. At least a part 
of the code is now better formatted.


Repository:
  rC Clang

https://reviews.llvm.org/D47459



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


[PATCH] D47450: [ASTImporter] Use InjectedClassNameType at import of templated record.

2018-06-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 152634.
balazske added a comment.

Small fixes.


Repository:
  rC Clang

https://reviews.llvm.org/D47450

Files:
  lib/AST/ASTImporter.cpp
  test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
  test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
  test/ASTMerge/injected-class-name-decl/test.cpp


Index: test/ASTMerge/injected-class-name-decl/test.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -std=c++1z -emit-pch -o %t.ast %S/Inputs/inject1.cpp
+// RUN: %clang_cc1 -std=c++1z -emit-obj -o /dev/null -ast-merge %t.ast 
%S/Inputs/inject2.cpp
+// expected-no-diagnostics
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
@@ -0,0 +1,2 @@
+template 
+X C::x;
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
@@ -0,0 +1,2 @@
+template 
+class C { static X x; };
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2128,6 +2128,29 @@
 if (!ToDescribed)
   return nullptr;
 D2CXX->setDescribedClassTemplate(ToDescribed);
+if (!DCXX->isInjectedClassName()) {
+  // In a record describing a template the type should be an
+  // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
+  // previously set type to the correct value here (ToDescribed is not
+  // available at record create).
+  // FIXME: The previous type is cleared but not removed from
+  // ASTContext's internal storage.
+  CXXRecordDecl *Injected = nullptr;
+  for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
+auto *Record = dyn_cast(Found);
+if (Record && Record->isInjectedClassName()) {
+  Injected = Record;
+  break;
+}
+  }
+  D2CXX->setTypeForDecl(nullptr);
+  Importer.getToContext().getInjectedClassNameType(D2CXX,
+  ToDescribed->getInjectedClassNameSpecialization());
+  if (Injected) {
+Injected->setTypeForDecl(nullptr);
+Importer.getToContext().getTypeDeclType(Injected, D2CXX);
+  }
+}
   } else if (MemberSpecializationInfo *MemberInfo =
DCXX->getMemberSpecializationInfo()) {
 TemplateSpecializationKind SK =


Index: test/ASTMerge/injected-class-name-decl/test.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/test.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -std=c++1z -emit-pch -o %t.ast %S/Inputs/inject1.cpp
+// RUN: %clang_cc1 -std=c++1z -emit-obj -o /dev/null -ast-merge %t.ast %S/Inputs/inject2.cpp
+// expected-no-diagnostics
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject2.cpp
@@ -0,0 +1,2 @@
+template 
+X C::x;
Index: test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
===
--- /dev/null
+++ test/ASTMerge/injected-class-name-decl/Inputs/inject1.cpp
@@ -0,0 +1,2 @@
+template 
+class C { static X x; };
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -2128,6 +2128,29 @@
 if (!ToDescribed)
   return nullptr;
 D2CXX->setDescribedClassTemplate(ToDescribed);
+if (!DCXX->isInjectedClassName()) {
+  // In a record describing a template the type should be an
+  // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
+  // previously set type to the correct value here (ToDescribed is not
+  // available at record create).
+  // FIXME: The previous type is cleared but not removed from
+  // ASTContext's internal storage.
+  CXXRecordDecl *Injected = nullptr;
+  for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
+auto *Record = dyn_cast(Found);
+if (Record && Record->isInjectedClassName()) {
+  Injected = Record;
+  break;
+}
+  }
+  D2CXX->setTypeForDecl(nullptr);
+  Importer.getToContext().getInjectedClassNameType(D2CXX,
+  ToDescribed->getInjectedClassNameSpecialization());
+  if (Injected) {
+Injected->setTypeForDecl(nullptr);
+Importer.getToContex

[PATCH] D51633: [ASTImporter] Added error handling for AST import.

2018-10-15 Thread Balázs Kéri via Phabricator via cfe-commits
balazske marked 9 inline comments as done.
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:2683
+continue;
+  } else if (isa(Found))
+continue;

a_sidorin wrote:
> Same here.
I do not know exactly why this was made, it looks like a bugfix for a problem 
encountered during the tests. Maybe I can undo this change (there are other 
related problem fixes so this is probably not needed).



Comment at: lib/AST/ASTImporter.cpp:4604
+  if (Error Err = ImportDeclContext(D))
+// FIXME: Really ignore the error?
+consumeError(std::move(Err));

a_sidorin wrote:
> I think we can just `return std::move(Err);` as it was done below.
Changed to return the error.



Comment at: lib/AST/ASTImporter.cpp:5657
+  if (!ToSemiLocOrErr)
+return nullptr;
+  return new (Importer.getToContext()) NullStmt(

a_sidorin wrote:
> Shouldn't we return an error here?
Good catch, this looks like the change was missed.


Repository:
  rC Clang

https://reviews.llvm.org/D51633



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


[PATCH] D51633: [ASTImporter] Added error handling for AST import.

2018-10-17 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

In the current version all clang tests do pass and most of the LLDB tests. Some 
LLDB tests do not work on my machine, the problems exist on master too.
This code is still a temporary version (possible to commit now or wait until 
every change is made?). Later the `Import` functions should return `Expected` 
and the remaining functions in ASTImporter.cpp should be updated. For 
compatibility with old code in LLDB the `Import` functions can not be changed 
without LLDB code changes so a `Import_New` will be created instead. Code in 
clang will only use the `Import_New`. When LLDB was updated, `Import_New` 
should be renamed to `Import`.


Repository:
  rC Clang

https://reviews.llvm.org/D51633



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


[PATCH] D51633: [ASTImporter] Added error handling for AST import.

2018-10-18 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

To the reviewers: Please accept this patch formally if you do not find any 
problems. This is an intermediate state of the code and there is more work that 
is dependent on this change.


Repository:
  rC Clang

https://reviews.llvm.org/D51633



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


[PATCH] D51633: [ASTImporter] Added error handling for AST import.

2018-10-19 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:8197
 
-void ASTImporter::ImportDefinition(Decl *From) {
+Error ASTImporter::ImportDefinition_New(Decl *From) {
   Decl *To = Import(From);

a_sidorin wrote:
> ImportDefinitionOrError?
The intention was to make the `_New` name only temporary until only this new 
function is used therefore it is not a nice name (requires changes in LLDB). 
Then it should be renamed back to `ImportDefinition`. It is probably not needed 
to indicate in the name that the function can fail, it can be seen from the 
return value. (This will be the case with other `Import` functions later.)


Repository:
  rC Clang

https://reviews.llvm.org/D51633



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


[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, Szelethus, martong, dkrupp.
Herald added a reviewer: a.sidorin.

These Import_New functions should be used in the ASTImporter,
and the old Import functions should not be used. Later the
Import_New should be renamed to Import again and the old Import
functions must be removed. But this can happen only after LLDB
was updated to use the new Import interface.

This commit is only about introducing the new Import_New
functions. These are not implemented now, only calling the old
Import ones.


Repository:
  rC Clang

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7656,6 +7656,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7682,6 +7688,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7715,6 +7727,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7803,13 +7821,25 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
 
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7845,6 +7875,12 @@
   return *ToSOrErr;
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7898,6 +7934,10 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7969,6 +8009,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8059,6 +8105,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8073,10 +8125,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8134,6 +8196,12 @@
   return ToID;
 }
 
+Expected ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
   Expr *ToExpr = Import(From->getInit());
   if (!ToExpr && From->getInit())
@@ -8179,6 +8247,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(const CXXBa

[PATCH] D53655: [ASTImporter] Fix redecl chain of classes and class templates

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:5054
+if (!ToTemplated->getPreviousDecl()) {
+  auto *PrevTemplated = 
FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
+  if (ToTemplated != PrevTemplated)

This is a long line that should be split.


Repository:
  rC Clang

https://reviews.llvm.org/D53655



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


[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 171278.
balazske added a comment.

- Corrected Import_New(const Attr *)


Repository:
  rC Clang

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7656,6 +7656,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7682,6 +7688,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7696,8 +7708,12 @@
   T, Import(FromTSI->getTypeLoc().getBeginLoc()));
 }
 
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
+  return Import(FromAttr);
+}
 Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
+  // NOTE: Import of SourceRange may fail.
   ToAttr->setRange(Import(FromAttr->getRange()));
   return ToAttr;
 }
@@ -7715,6 +7731,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7803,13 +7825,25 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
 
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7845,6 +7879,12 @@
   return *ToSOrErr;
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7898,6 +7938,10 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7969,6 +8013,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8059,6 +8109,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8073,10 +8129,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8134,6 +8200,12 @@
   return ToID;
 }
 
+Expected ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
   Expr *ToExpr = Import(From->getInit());
   if (!ToExpr && From->getInit())
@@ -8179,6 +8251,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(const CXXBaseSpecifier *From) {
+  CXXBaseSpecifier *To = Import(From);
+  if

[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, Szelethus, martong, dkrupp.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: a.sidorin.

Repository:
  rC Clang

https://reviews.llvm.org/D53757

Files:
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -187,32 +187,20 @@
 // Use this to import pointers of specific type.
 template 
 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
-  auto ToI = Importer.Import(From);
-  if (!ToI && From)
-return make_error();
-  To = cast_or_null(ToI);
-  return Error::success();
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (ToOrErr) {
-  //  To = cast_or_null(*ToOrErr);
-  //}
-  //return ToOrErr.takeError();
+  auto ToOrErr = Importer.Import_New(From);
+  if (ToOrErr)
+To = cast_or_null(*ToOrErr);
+  return ToOrErr.takeError();
 }
 
 // Call the import function of ASTImporter for a baseclass of type `T` and
 // cast the return value to `T`.
 template 
 Expected import(T *From) {
-  auto *To = Importer.Import(From);
-  if (!To && From)
-return make_error();
-  return cast_or_null(To);
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (!ToOrErr)
-  //  return ToOrErr.takeError();
-  //return cast_or_null(*ToOrErr);
+  auto ToOrErr = Importer.Import_New(From);
+  if (!ToOrErr)
+return ToOrErr.takeError();
+  return cast_or_null(*ToOrErr);
 }
 
 template 
@@ -223,13 +211,7 @@
 // Call the import function of ASTImporter for type `T`.
 template 
 Expected import(const T &From) {
-  T To = Importer.Import(From);
-  T DefaultT;
-  if (To == DefaultT && !(From == DefaultT))
-return make_error();
-  return To;
-  // FIXME: This should be the final code.
-  //return Importer.Import(From);
+  return Importer.Import_New(From);
 }
 
 template 
@@ -319,8 +301,15 @@
   Importer.MapImported(FromD, ToD);
   ToD->IdentifierNamespace = FromD->IdentifierNamespace;
   if (FromD->hasAttrs())
-for (const Attr *FromAttr : FromD->getAttrs())
-  ToD->addAttr(Importer.Import(FromAttr));
+for (const Attr *FromAttr : FromD->getAttrs()) {
+  // FIXME: Return of the error here is not possible until store of
+  // import errors is implemented.
+  auto ToAttrOrErr = import(FromAttr);
+  if (ToAttrOrErr)
+ToD->addAttr(*ToAttrOrErr);
+  else
+llvm::consumeError(ToAttrOrErr.takeError());
+}
   if (FromD->isUsed())
 ToD->setIsUsed();
   if (FromD->isImplicit())
@@ -665,15 +654,6 @@
 FunctionDecl *FromFD);
   };
 
-// FIXME: Temporary until every import returns Expected.
-template <>
-Expected ASTNodeImporter::import(const TemplateName &From) {
-  TemplateName To = Importer.Import(From);
-  if (To.isNull() && !From.isNull())
-return make_error();
-  return To;
-}
-
 template 
 Error ASTNodeImporter::ImportTemplateArgumentListInfo(
 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
@@ -1707,15 +1687,10 @@
 static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
ASTImporter &Importer) {
   if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
-Decl *ToTypedef = Importer.Import(FromTypedef);
-if (!ToTypedef)
-  return make_error();
-To->setTypedefNameForAnonDecl(cast(ToTypedef));
-// FIXME: This should be the final code.
-//if (Expected ToTypedefOrErr = Importer.Import(FromTypedef))
-//  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
-//else
-//  return ToTypedefOrErr.takeError();
+if (ExpectedDecl ToTypedefOrErr = Importer.Import_New(FromTypedef))
+  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
+else
+  return ToTypedefOrErr.takeError();
   }
   return Error::success();
 }
@@ -3438,9 +3413,6 @@
 // FIXME here we leak `NamedChain` which is allocated before
 return ToIndirectField;
 
-  for (const auto *Attr : D->attrs())
-ToIndirectField->addAttr(Importer.Import(Attr));
-
   ToIndirectField->setAccess(D->getAccess());
   ToIndirectField->setLexicalDeclContext(LexicalDC);
   LexicalDC->addDeclInternal(ToIndirectField);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53755: [ASTImporter] Remove import of definition from GetAlreadyImportedOrNull

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:7716
   }
 }
 

This can be simplified by removing brace characters and removing `ToD`.


Repository:
  rC Clang

https://reviews.llvm.org/D53755



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


[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-10-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 171292.
balazske added a comment.

- Added missing Import_New with Selector and DeclarationName.


Repository:
  rC Clang

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7656,6 +7656,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7682,6 +7688,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7696,8 +7708,12 @@
   T, Import(FromTSI->getTypeLoc().getBeginLoc()));
 }
 
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
+  return Import(FromAttr);
+}
 Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
+  // NOTE: Import of SourceRange may fail.
   ToAttr->setRange(Import(FromAttr->getRange()));
   return ToAttr;
 }
@@ -7715,6 +7731,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7803,13 +7825,25 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
 
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7845,6 +7879,12 @@
   return *ToSOrErr;
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7898,6 +7938,10 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7969,6 +8013,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8059,6 +8109,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8073,10 +8129,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8134,6 +8200,12 @@
   return ToID;
 }
 
+Expected ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
   Expr *ToExpr = Import(From->getInit());
   if (!ToExpr && From->getInit())
@@ -8179,6 +8251,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(const CXXBaseSpecifier *From) {
+  CXXBaseSpecifier 

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-10-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, Szelethus, martong, dkrupp.
Herald added a reviewer: a.sidorin.

Repository:
  rC Clang

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -154,25 +154,6 @@
 return None;
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7657,14 +7638,8 @@
 ASTImporter::~ASTImporter() = default;
 
 Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7677,46 +7652,65 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
+
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
   llvm::DenseMap::iterator Pos = ImportedDecls.find(FromD);
@@ -7732,12 +7726,6 @@
 }
 
 Expected ASTImporter::Import_New(Decl *FromD) {
-  Decl *ToD = Import(FromD);
-  if (!ToD && FromD)
-return llvm::make_error();
-  return ToD;
-}
-Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7751,19 +7739,25 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }
+  if (!ToDOrErr)
+return ToDOrErr;
   ToD = *ToDOrErr;
 
   // Notify subclasses.
   Imported(FromD, ToD);
 
   updateFlags(FromD, ToD);
-  return ToD;
+  return ToDOrErr;
+}
+Decl *ASTImporter::Import(Decl *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nu

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-10-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

The Import functions are replaced by Import_New and error handling is added. 
This is done in the implementation of the Import_New functions itself, and in 
importInto. (Code of old Import functions is moved to the Import_New and 
updated to use Import_New.) Some other functions in ASTImporter are still using 
the Import, these are to be changed later.


Repository:
  rC Clang

https://reviews.llvm.org/D53818



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-10-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 171519.
balazske added a comment.

Reformatted code.


Repository:
  rC Clang

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -154,25 +154,6 @@
 return None;
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7656,9 +7637,9 @@
 
 ASTImporter::~ASTImporter() = default;
 
-QualType ASTImporter::Import(QualType FromT) {
+Expected ASTImporter::Import_New(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7671,36 +7652,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
-Attr *ASTImporter::Import(const Attr *FromAttr) {
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
   llvm::DenseMap::iterator Pos = ImportedDecls.find(FromD);
@@ -7715,7 +7724,7 @@
   }
 }
 
-Decl *ASTImporter::Import(Decl *FromD) {
+Expected ASTImporter::Import_New(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7729,19 +7738,25 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }
+  if (!ToDOrErr)
+return ToDOrErr;
   ToD = *ToDOrErr;
 
   // Notify subclasses.
   Imported(FromD, ToD);
 
   updateFlags(FromD, ToD);
-  return ToD;
+  return ToDOrErr;
+}
+Decl *ASTImporter::Import(Decl *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::ImportContext(DeclContext *FromDC) {
@@ -7803,29 +7818,35 @@
   return ToDC;
 }
 
-Expr *ASTImporter::Import(Expr *FromE) {
-  if (!FromE)
-return nullptr;
-
-  return cast_or_null(Import(cast(FromE)));
+Expected ASTImporter::Import_New(Expr *FromE) {
+  if (ExpectedStmt ToSOrErr = Import_New(cast_or_null(FromE)))
+return cast_or_null(*ToSOrErr);
+  else
+return ToSOrErr.takeError();
+}
+Expr *ASTImporter

[PATCH] D56936: Fix handling of overriden methods during ASTImport

2019-01-21 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:3046
+if (!D->doesThisDeclarationHaveABody())
+  return cast(const_cast(FoundByLookup));
+else {

The `cast` should not be needed here (and is not done at the other return 
places). The `const_cast` can be omitted too (`FoundByLookup` is not const now).



Comment at: unittests/AST/ASTImporterTest.cpp:2243
+  auto BP = cxxMethodDecl(hasName("f"), 
hasParent(cxxRecordDecl(hasName("B";
+  auto DP = cxxMethodDecl(hasName("f"), 
hasParent(cxxRecordDecl(hasName("D";
+

I think names like `BP` and `BFP ` could be better (`P` should stand for 
"Pattern" and always the last part of the name, so use `BFP` and `BFIsDefP`). 
And for storing `B::F` a `BF` can be better name than `B`.



Comment at: unittests/AST/ASTImporterTest.cpp:2260
+TEST_P(ImportFunctions, ImportOverriddenMethodTwiceDefinitionFirst) {
+  auto CodeWithOutDef =
+  R"(

Use `CodeWithoutDef`.



Comment at: unittests/AST/ASTImporterTest.cpp:2312
+  auto DFP =
+  cxxMethodDecl(hasName("f"), hasParent(cxxRecordDecl(hasName("D";
+

It is ensured only by `FirstDeclMatcher` that not the definition is found (this 
pattern may match the definition too) for `BFP`. It may be more accurate to 
include in the pattern that this is not a definition.



Comment at: unittests/AST/ASTImporterTest.cpp:2325
+  EXPECT_EQ(DeclCounter().match(ToTU, BFP), 1u);
+  EXPECT_EQ(DeclCounter().match(ToTU, BFPIsDef), 0u);
+

For the out-of-class definition the `hasParent(cxxRecordDecl(hasName("B")))` 
does not match? (Otherwise this count should be 1.)



Comment at: unittests/AST/ASTImporterTest.cpp:2344
+
+TEST_P(ImportFunctions, ImportOverriddenMethodTwiceOutOfClassDefTwoTUs) {
+  auto CodeTU0 =

The previous tests use two TUs too so the name for this is not exact (here the 
code is different, maybe use 
`ImportOverriddenMethodTwiceOutOfClassDefInSeparateCode`?). This test does 
roughly the same as `ImportOverriddenMethodTwiceDefinitionFirst` but with the 
definition last and out-of-class version. (Name can be 
`ImportOverriddenMethodTwiceOutOfClassDefLast` too.) I am not sure why is the 
`foo` used here (`B::F` can be imported instead).



Comment at: unittests/AST/ASTImporterTest.cpp:2366
+  auto DFPIsDef = cxxMethodDecl(
+  hasName("f"), hasParent(cxxRecordDecl(hasName("B"))), isDefinition());
+  auto FooDef = functionDecl(hasName("foo"));

`hasName("B")` is wrong here, should be "D"?


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

https://reviews.llvm.org/D56936



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2019-01-22 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 182866.
balazske added a comment.

- Small style corrections.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -134,25 +134,6 @@
   To->setIsUsed();
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7623,13 +7604,6 @@
 
 ASTImporter::~ASTImporter() = default;
 
-Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-
 Optional ASTImporter::getFieldIndex(Decl *F) {
   assert(F && (isa(*F) || isa(*F)) &&
   "Try to get field index for non-field.");
@@ -7681,9 +7655,9 @@
   LookupTable->add(ToND);
 }
 
-QualType ASTImporter::Import(QualType FromT) {
+Expected ASTImporter::Import_New(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7696,46 +7670,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
   auto Pos = ImportedDecls.find(FromD);
@@ -7746,12 +7738,6 @@
 }
 
 Expected ASTImporter::Import_New(Decl *FromD) {
-  Decl *ToD = Import(FromD);
-  if (!ToD && FromD)
-return llvm::make_error();
-  return ToD;
-}
-Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7765,12 +7751,10 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }
+  if (!ToDOrErr)
+return ToDOrErr;
   ToD = *ToDOrErr;
 
   // Once

[PATCH] D56936: Fix handling of overriden methods during ASTImport

2019-01-23 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

So the problem is that there are references to `ParmVarDecl` from inside 
function body and at import of `ParmVarDecl` always a new one is created even 
if there is an already existing (in the existing function prototype)? Maybe it 
works in `VisitParmVarDecl` to search for already existing `ParmVarDecl` (not 
already imported) and return if found.


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

https://reviews.llvm.org/D56936



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


[PATCH] D56936: Fix handling of overriden methods during ASTImport

2019-01-24 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/ASTImporter.cpp:2950
 
+ExpectedStmt ASTNodeImporter::ImportFunctionDeclBody( FunctionDecl *FromFD, 
FunctionDecl *ToFD ) {
+if (Stmt *FromBody = FromFD->getBody()) {

It would be better to return `Error` instead of `Expected`. The return value 
(Stmt*) is not used and it may be nullptr if the `FromFD` does not have a body.



Comment at: lib/AST/ASTImporter.cpp:2959
+}
+
 ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {

Code formatting is not OK in this function (and other places). (Indentation and 
spaces around "(" ")".)



Comment at: unittests/AST/ASTImporterTest.cpp:2311
+  auto DFP =
+  cxxMethodDecl(hasName("f"), hasParent(cxxRecordDecl(hasName("D"))), 
unless(isDefinition()) );
+

This line is too long. clang-format can be used to format the code 
automatically (or git-clang-format).


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

https://reviews.llvm.org/D56936



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


[PATCH] D56936: Fix handling of overriden methods during ASTImport

2019-01-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: unittests/AST/ASTImporterTest.cpp:2312
+  cxxMethodDecl(hasName("f"), hasParent(cxxRecordDecl(hasName("B";
+  auto BFPIsDefP = cxxMethodDecl(
+  hasName("f"), hasParent(cxxRecordDecl(hasName("B"))), isDefinition());

Looks mainly OK now. Only a small problem, I do not like names like `BFPIsDefP` 
here and later, in the previous test it is correctly named `BFDefP` (could be 
`BFIsDefP` too).


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

https://reviews.llvm.org/D56936



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


[PATCH] D57232: [ASTImporter] Check visibility/linkage of functions and variables

2019-01-25 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: unittests/AST/ASTImporterTest.cpp:2523
+  Decl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+  cast(ToTU)->dumpDeclContext();
+  ASSERT_EQ(DeclCounter().match(ToTU, 
functionDecl(hasName("f"))),

Is this dump needed? (The test should not write unnecessary text output. But 
debug statements can be leaved in the test, possibly in comment.)


Repository:
  rC Clang

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

https://reviews.llvm.org/D57232



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


[PATCH] D57322: [ASTImporter] Refactor unittests to be able to parameterize them in a more flexible way

2019-01-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: unittests/AST/ASTImporterTest.cpp:15
+// FIXME: Better solution for this?
+#define GTEST_HAS_COMBINE 1
+

Define of this is related to the new visibility tests, but not a problem is 
this remains here (there is another not strictly related thing: The new 
`Import` template).


Repository:
  rC Clang

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

https://reviews.llvm.org/D57322



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-15 Thread Balázs Kéri via Phabricator via cfe-commits
balazske marked 3 inline comments as done.
balazske added a comment.

If we change signature of `Import` now, other parts of the code (in clang and 
LLDB) would not compile (without changing to use the new kind of Import). If 
there is a `Import_New` the old code can still compile and can be changed later.




Comment at: lib/AST/ASTImporter.cpp:7889
+return NestedNameSpecifier::Create(ToContext, Prefix,
+   Import(FromNNS->getAsIdentifier()));
 

a_sidorin wrote:
> We can use Import_New if we change this code, like it is done below.
For `IdentifierInfo` there is no Import_New because this is the one kind of 
import that can not fail, it remains the same Import as before (does not return 
`Expected`).


Repository:
  rC Clang

https://reviews.llvm.org/D53818



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-15 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 174168.
balazske added a comment.

- Small style corrections.


Repository:
  rC Clang

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -154,25 +154,6 @@
 return None;
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7656,9 +7637,9 @@
 
 ASTImporter::~ASTImporter() = default;
 
-QualType ASTImporter::Import(QualType FromT) {
+Expected ASTImporter::Import_New(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7671,36 +7652,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
-Attr *ASTImporter::Import(const Attr *FromAttr) {
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
   llvm::DenseMap::iterator Pos = ImportedDecls.find(FromD);
@@ -7715,7 +7724,7 @@
   }
 }
 
-Decl *ASTImporter::Import(Decl *FromD) {
+Expected ASTImporter::Import_New(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7729,19 +7738,25 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }
+  if (!ToDOrErr)
+return ToDOrErr;
   ToD = *ToDOrErr;
 
   // Notify subclasses.
   Imported(FromD, ToD);
 
   updateFlags(FromD, ToD);
-  return ToD;
+  return ToDOrErr;
+}
+Decl *ASTImporter::Import(Decl *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::ImportContext(DeclContext *FromDC) {
@@ -7803,29 +7818,35 @@
   return ToDC;
 }
 
-Expr *ASTImporter::Import(Expr *FromE) {
-  if (!FromE)
-return nullptr;
-
-  return cast_or_null(Import(cast(FromE)));
+Expected ASTImporter::Import_New(Expr *FromE) {
+  if (ExpectedStmt ToSOrErr = Import_New(cast_or_null(FromE)))
+return cast_or_null(*ToSOrErr);
+  else
+return ToSOrErr.takeError();
+}
+Expr *AS

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-15 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: include/clang/AST/ASTImporter.h:192
 ///
-/// \returns the equivalent declaration in the "to" context, or a NULL type
-/// if an error occurred.
+/// \returns The equivalent declaration in the "to" context, or the import
+/// error.

a_sidorin wrote:
> an import error?
I do not know what is the correct, but a specific import error is returned, 
that occurred during the import.



Comment at: include/clang/AST/ASTImporter.h:198
+}
+// FIXME: Remove this version.
 Decl *Import(Decl *FromD);

a_sidorin wrote:
> these versions
If the other comment is changed I can change this too, but alone this is not 
worth it. This is anyway a temporary comment, and if the first `Import` there 
is removed the second can not compile anyway (and the `Import_New` will be the 
`Import` later).


Repository:
  rC Clang

https://reviews.llvm.org/D53818



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


[PATCH] D53655: [ASTImporter] Fix redecl chain of classes and class templates

2018-11-22 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: lib/AST/DeclBase.cpp:1469
 assert(Pos != Map->end() && "no lookup entry for decl");
-if (Pos->second.getAsVector() || Pos->second.getAsDecl() == ND)
+// Remove the decl only if it is contained.
+if ((Pos->second.getAsVector() && Pos->second.containsInVector(ND)) ||

martong wrote:
> Szelethus wrote:
> > Contained in?
> Indeed, `containedInVector` sounds better, so I renamed.
For me, `containsInVector` is the better name, or `hasInVector` ("contains" is 
already used at other places but not "contained" and it sounds like it is not 
contained any more).


Repository:
  rC Clang

https://reviews.llvm.org/D53655



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


[PATCH] D53655: [ASTImporter] Fix redecl chain of classes and class templates

2018-11-23 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

I see that now everything is reverted, the "good" things too (change to 
indirectFieldDecl and a line split)?


Repository:
  rC Clang

https://reviews.llvm.org/D53655



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


[PATCH] D53655: [ASTImporter] Fix redecl chain of classes and class templates

2018-11-23 Thread Balázs Kéri via Phabricator via cfe-commits
balazske accepted this revision.
balazske added a comment.
This revision is now accepted and ready to land.

Do not forget that there is a fix the to use getMostRecentDecl in 
ASTImporter.cpp line 2666 here.


Repository:
  rC Clang

https://reviews.llvm.org/D53655



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


[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-11-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175207.
balazske added a comment.

- Split long lines.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7656,6 +7656,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7682,6 +7688,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7696,8 +7708,12 @@
   T, Import(FromTSI->getTypeLoc().getBeginLoc()));
 }
 
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
+  return Import(FromAttr);
+}
 Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
+  // NOTE: Import of SourceRange may fail.
   ToAttr->setRange(Import(FromAttr->getRange()));
   return ToAttr;
 }
@@ -7715,6 +7731,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7803,6 +7825,12 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
@@ -7810,6 +7838,12 @@
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7845,6 +7879,12 @@
   return *ToSOrErr;
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7898,6 +7938,10 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7969,6 +8013,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8059,6 +8109,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8073,10 +8129,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8134,6 +8200,12 @@
   return ToID;
 }
 
+Expected ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
   Expr *ToExpr = Import(From->getInit());
   if (!ToExpr && From->getInit())
@@ -8179,6 +8251,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(const CX

[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-11-26 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175212.
balazske marked an inline comment as done.
balazske added a comment.

- Split long lines (ASTImporter.cpp).


Repository:
  rC Clang

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

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7656,6 +7656,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7682,6 +7688,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7696,8 +7708,12 @@
   T, Import(FromTSI->getTypeLoc().getBeginLoc()));
 }
 
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
+  return Import(FromAttr);
+}
 Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
+  // NOTE: Import of SourceRange may fail.
   ToAttr->setRange(Import(FromAttr->getRange()));
   return ToAttr;
 }
@@ -7715,6 +7731,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7803,6 +7825,12 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
@@ -7810,6 +7838,12 @@
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7845,6 +7879,13 @@
   return *ToSOrErr;
 }
 
+Expected
+ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7898,6 +7939,11 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected
+ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7969,6 +8015,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8059,6 +8111,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8073,10 +8131,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8134,6 +8202,13 @@
   return ToID;
 }
 
+Expected
+ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
   Expr *ToExpr = Import(From->getInit());
   if (!ToExpr && From->getInit())
@@ -8179,6 

[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-11-27 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175529.
balazske added a comment.

- Corrected Import_New(const Attr *)
- Added missing Import_New with Selector and DeclarationName.
- Split long lines.
- Split long lines (ASTImporter.cpp).

Rebase to newest master.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53751

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -7683,6 +7683,12 @@
 
 ASTImporter::~ASTImporter() = default;
 
+Expected ASTImporter::Import_New(QualType FromT) {
+  QualType ToT = Import(FromT);
+  if (ToT.isNull() && !FromT.isNull())
+return make_error();
+  return ToT;
+}
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
 return {};
@@ -7709,6 +7715,12 @@
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
 
+Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
+  TypeSourceInfo *ToTSI = Import(FromTSI);
+  if (!ToTSI && FromTSI)
+return llvm::make_error();
+  return ToTSI;
+}
 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
@@ -7723,8 +7735,12 @@
   T, Import(FromTSI->getTypeLoc().getBeginLoc()));
 }
 
+Expected ASTImporter::Import_New(const Attr *FromAttr) {
+  return Import(FromAttr);
+}
 Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
+  // NOTE: Import of SourceRange may fail.
   ToAttr->setRange(Import(FromAttr->getRange()));
   return ToAttr;
 }
@@ -7742,6 +7758,12 @@
   }
 }
 
+Expected ASTImporter::Import_New(Decl *FromD) {
+  Decl *ToD = Import(FromD);
+  if (!ToD && FromD)
+return llvm::make_error();
+  return ToD;
+}
 Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
@@ -7830,6 +7852,12 @@
   return ToDC;
 }
 
+Expected ASTImporter::Import_New(Expr *FromE) {
+  Expr *ToE = Import(FromE);
+  if (!ToE && FromE)
+return llvm::make_error();
+  return ToE;
+}
 Expr *ASTImporter::Import(Expr *FromE) {
   if (!FromE)
 return nullptr;
@@ -7837,6 +7865,12 @@
   return cast_or_null(Import(cast(FromE)));
 }
 
+Expected ASTImporter::Import_New(Stmt *FromS) {
+  Stmt *ToS = Import(FromS);
+  if (!ToS && FromS)
+return llvm::make_error();
+  return ToS;
+}
 Stmt *ASTImporter::Import(Stmt *FromS) {
   if (!FromS)
 return nullptr;
@@ -7872,6 +7906,13 @@
   return *ToSOrErr;
 }
 
+Expected
+ASTImporter::Import_New(NestedNameSpecifier *FromNNS) {
+  NestedNameSpecifier *ToNNS = Import(FromNNS);
+  if (!ToNNS && FromNNS)
+return llvm::make_error();
+  return ToNNS;
+}
 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   if (!FromNNS)
 return nullptr;
@@ -7925,6 +7966,11 @@
   llvm_unreachable("Invalid nested name specifier kind");
 }
 
+Expected
+ASTImporter::Import_New(NestedNameSpecifierLoc FromNNS) {
+  NestedNameSpecifierLoc ToNNS = Import(FromNNS);
+  return ToNNS;
+}
 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   // Copied from NestedNameSpecifier mostly.
   SmallVector NestedNames;
@@ -7996,6 +8042,12 @@
   return Builder.getWithLocInContext(getToContext());
 }
 
+Expected ASTImporter::Import_New(TemplateName From) {
+  TemplateName To = Import(From);
+  if (To.isNull() && !From.isNull())
+return llvm::make_error();
+  return To;
+}
 TemplateName ASTImporter::Import(TemplateName From) {
   switch (From.getKind()) {
   case TemplateName::Template:
@@ -8086,6 +8138,12 @@
   llvm_unreachable("Invalid template name kind");
 }
 
+Expected ASTImporter::Import_New(SourceLocation FromLoc) {
+  SourceLocation ToLoc = Import(FromLoc);
+  if (ToLoc.isInvalid() && !FromLoc.isInvalid())
+return llvm::make_error();
+  return ToLoc;
+}
 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   if (FromLoc.isInvalid())
 return {};
@@ -8100,10 +8158,20 @@
   return ToSM.getComposedLoc(ToFileID, Decomposed.second);
 }
 
+Expected ASTImporter::Import_New(SourceRange FromRange) {
+  SourceRange ToRange = Import(FromRange);
+  return ToRange;
+}
 SourceRange ASTImporter::Import(SourceRange FromRange) {
   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
 }
 
+Expected ASTImporter::Import_New(FileID FromID) {
+  FileID ToID = Import(FromID);
+  if (ToID.isInvalid() && FromID.isValid())
+return llvm::make_error();
+  return ToID;
+}
 FileID ASTImporter::Import(FileID FromID) {
   llvm::DenseMap::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
@@ -8161,6 +8229,13 @@
   return ToID;
 }
 
+Expected
+ASTImporter::Import_New(CXXCtorInitializer *From) {
+  CXXCtorInitializer *To = Import(From);
+  if (!To && From)
+return llvm::make_error();
+  return To;
+}
 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitiali

[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-11-27 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL347685: [ASTImporter] Added Import functions for transition 
to new API. (authored by balazske, committed by ).
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

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

https://reviews.llvm.org/D53751

Files:
  cfe/trunk/include/clang/AST/ASTImporter.h
  cfe/trunk/lib/AST/ASTImporter.cpp

Index: cfe/trunk/include/clang/AST/ASTImporter.h
===
--- cfe/trunk/include/clang/AST/ASTImporter.h
+++ cfe/trunk/include/clang/AST/ASTImporter.h
@@ -166,30 +166,41 @@
 }
 
 /// Import the given type from the "from" context into the "to"
-/// context.
+/// context. A null type is imported as a null type (no error).
 ///
-/// \returns the equivalent type in the "to" context, or a NULL type if
-/// an error occurred.
+/// \returns The equivalent type in the "to" context, or the import error.
+llvm::Expected Import_New(QualType FromT);
+// FIXME: Remove this version.
 QualType Import(QualType FromT);
 
 /// Import the given type source information from the
 /// "from" context into the "to" context.
 ///
-/// \returns the equivalent type source information in the "to"
-/// context, or NULL if an error occurred.
+/// \returns The equivalent type source information in the "to"
+/// context, or the import error.
+llvm::Expected Import_New(TypeSourceInfo *FromTSI);
+// FIXME: Remove this version.
 TypeSourceInfo *Import(TypeSourceInfo *FromTSI);
 
 /// Import the given attribute from the "from" context into the
 /// "to" context.
 ///
-/// \returns the equivalent attribute in the "to" context.
+/// \returns The equivalent attribute in the "to" context, or the import
+/// error.
+llvm::Expected Import_New(const Attr *FromAttr);
+// FIXME: Remove this version.
 Attr *Import(const Attr *FromAttr);
 
 /// Import the given declaration from the "from" context into the
 /// "to" context.
 ///
-/// \returns the equivalent declaration in the "to" context, or a NULL type
-/// if an error occurred.
+/// \returns The equivalent declaration in the "to" context, or the import
+/// error.
+llvm::Expected Import_New(Decl *FromD);
+llvm::Expected Import_New(const Decl *FromD) {
+  return Import_New(const_cast(FromD));
+}
+// FIXME: Remove this version.
 Decl *Import(Decl *FromD);
 Decl *Import(const Decl *FromD) {
   return Import(const_cast(FromD));
@@ -210,87 +221,117 @@
 /// Import the given expression from the "from" context into the
 /// "to" context.
 ///
-/// \returns the equivalent expression in the "to" context, or NULL if
-/// an error occurred.
+/// \returns The equivalent expression in the "to" context, or the import
+/// error.
+llvm::Expected Import_New(Expr *FromE);
+// FIXME: Remove this version.
 Expr *Import(Expr *FromE);
 
 /// Import the given statement from the "from" context into the
 /// "to" context.
 ///
-/// \returns the equivalent statement in the "to" context, or NULL if
-/// an error occurred.
+/// \returns The equivalent statement in the "to" context, or the import
+/// error.
+llvm::Expected Import_New(Stmt *FromS);
+// FIXME: Remove this version.
 Stmt *Import(Stmt *FromS);
 
 /// Import the given nested-name-specifier from the "from"
 /// context into the "to" context.
 ///
-/// \returns the equivalent nested-name-specifier in the "to"
-/// context, or NULL if an error occurred.
+/// \returns The equivalent nested-name-specifier in the "to"
+/// context, or the import error.
+llvm::Expected
+Import_New(NestedNameSpecifier *FromNNS);
+// FIXME: Remove this version.
 NestedNameSpecifier *Import(NestedNameSpecifier *FromNNS);
 
-/// Import the given nested-name-specifier from the "from"
+/// Import the given nested-name-specifier-loc from the "from"
 /// context into the "to" context.
 ///
-/// \returns the equivalent nested-name-specifier in the "to"
-/// context.
+/// \returns The equivalent nested-name-specifier-loc in the "to"
+/// context, or the import error.
+llvm::Expected
+Import_New(NestedNameSpecifierLoc FromNNS);
+// FIXME: Remove this version.
 NestedNameSpecifierLoc Import(NestedNameSpecifierLoc FromNNS);
 
-/// Import the goven template name from the "from" context into the
-/// "to" context.
+/// Import the given template name from the "from" context into the
+/// "to" context, or the import error.
+llvm::Expected Import_New(TemplateName From);
+// FIXME: Remove this version.
 TemplateName Import(TemplateName From);
 
 /// Import the given source location from the "from" context into
 /// the "t

[PATCH] D53751: [ASTImporter] Added Import functions for transition to new API.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

It is really "ugly" thing to have a Import_New and a Import for the same 
functionality. Without these a single large patch would have been needed for 
clang and another smaller one for LLDB that must be committed "at the same 
time". Now 1 dependent patch is under review. Then 1 patch is to do for clang 
and one for lldb (these can contain the removal of Import_New too). It mainly 
depends on the speed of the reviews how fast the update happens.


Repository:
  rL LLVM

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

https://reviews.llvm.org/D53751



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175649.
balazske added a comment.

Rebase to newest master.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -154,25 +154,6 @@
 return None;
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7684,14 +7665,8 @@
 ASTImporter::~ASTImporter() = default;
 
 Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7704,46 +7679,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
   llvm::DenseMap::iterator Pos = ImportedDecls.find(FromD);
@@ -7759,12 +7752,6 @@
 }
 
 Expected ASTImporter::Import_New(Decl *FromD) {
-  Decl *ToD = Import(FromD);
-  if (!ToD && FromD)
-return llvm::make_error();
-  return ToD;
-}
-Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7778,19 +7765,25 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }
+  if (!ToDOrErr)
+return ToDOrErr;
   ToD = *ToDOrErr;
 
   // Notify subclasses.
   Imported(FromD, ToD);
 
   updateFlags(FromD, ToD);
-  return ToD;
+  return ToDOrErr;
+}
+Decl *ASTImporter::Import(Decl *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL347752: [ASTImporter] Changed use of Import to Import_New in 
ASTImporter. (authored by balazske, committed by ).
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

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

https://reviews.llvm.org/D53818

Files:
  cfe/trunk/include/clang/AST/ASTImporter.h
  cfe/trunk/lib/AST/ASTImporter.cpp

Index: cfe/trunk/include/clang/AST/ASTImporter.h
===
--- cfe/trunk/include/clang/AST/ASTImporter.h
+++ cfe/trunk/include/clang/AST/ASTImporter.h
@@ -154,15 +154,10 @@
 /// \return Error information (success or error).
 template 
 LLVM_NODISCARD llvm::Error importInto(ImportT &To, const ImportT &From) {
-  To = Import(From);
-  if (From && !To)
-  return llvm::make_error();
-  return llvm::Error::success();
-  // FIXME: this should be the final code
-  //auto ToOrErr = Import(From);
-  //if (ToOrErr)
-  //  To = *ToOrErr;
-  //return ToOrErr.takeError();
+  auto ToOrErr = Import_New(From);
+  if (ToOrErr)
+To = *ToOrErr;
+  return ToOrErr.takeError();
 }
 
 /// Import the given type from the "from" context into the "to"
Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -154,25 +154,6 @@
 return None;
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7684,14 +7665,8 @@
 ASTImporter::~ASTImporter() = default;
 
 Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7704,46 +7679,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected 

[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175675.
balazske added a comment.
Herald added a reviewer: shafik.
Herald added a subscriber: gamesh411.

Rebase to master.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53757

Files:
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -168,32 +168,20 @@
 // Use this to import pointers of specific type.
 template 
 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
-  auto ToI = Importer.Import(From);
-  if (!ToI && From)
-return make_error();
-  To = cast_or_null(ToI);
-  return Error::success();
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (ToOrErr) {
-  //  To = cast_or_null(*ToOrErr);
-  //}
-  //return ToOrErr.takeError();
+  auto ToOrErr = Importer.Import_New(From);
+  if (ToOrErr)
+To = cast_or_null(*ToOrErr);
+  return ToOrErr.takeError();
 }
 
 // Call the import function of ASTImporter for a baseclass of type `T` and
 // cast the return value to `T`.
 template 
 Expected import(T *From) {
-  auto *To = Importer.Import(From);
-  if (!To && From)
-return make_error();
-  return cast_or_null(To);
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (!ToOrErr)
-  //  return ToOrErr.takeError();
-  //return cast_or_null(*ToOrErr);
+  auto ToOrErr = Importer.Import_New(From);
+  if (!ToOrErr)
+return ToOrErr.takeError();
+  return cast_or_null(*ToOrErr);
 }
 
 template 
@@ -204,13 +192,7 @@
 // Call the import function of ASTImporter for type `T`.
 template 
 Expected import(const T &From) {
-  T To = Importer.Import(From);
-  T DefaultT;
-  if (To == DefaultT && !(From == DefaultT))
-return make_error();
-  return To;
-  // FIXME: This should be the final code.
-  //return Importer.Import(From);
+  return Importer.Import_New(From);
 }
 
 template 
@@ -300,8 +282,15 @@
   Importer.MapImported(FromD, ToD);
   ToD->IdentifierNamespace = FromD->IdentifierNamespace;
   if (FromD->hasAttrs())
-for (const Attr *FromAttr : FromD->getAttrs())
-  ToD->addAttr(Importer.Import(FromAttr));
+for (const Attr *FromAttr : FromD->getAttrs()) {
+  // FIXME: Return of the error here is not possible until store of
+  // import errors is implemented.
+  auto ToAttrOrErr = import(FromAttr);
+  if (ToAttrOrErr)
+ToD->addAttr(*ToAttrOrErr);
+  else
+llvm::consumeError(ToAttrOrErr.takeError());
+}
   if (FromD->isUsed())
 ToD->setIsUsed();
   if (FromD->isImplicit())
@@ -647,15 +636,6 @@
 FunctionDecl *FromFD);
   };
 
-// FIXME: Temporary until every import returns Expected.
-template <>
-Expected ASTNodeImporter::import(const TemplateName &From) {
-  TemplateName To = Importer.Import(From);
-  if (To.isNull() && !From.isNull())
-return make_error();
-  return To;
-}
-
 template 
 Error ASTNodeImporter::ImportTemplateArgumentListInfo(
 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
@@ -1693,15 +1673,10 @@
 static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
ASTImporter &Importer) {
   if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
-Decl *ToTypedef = Importer.Import(FromTypedef);
-if (!ToTypedef)
-  return make_error();
-To->setTypedefNameForAnonDecl(cast(ToTypedef));
-// FIXME: This should be the final code.
-//if (Expected ToTypedefOrErr = Importer.Import(FromTypedef))
-//  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
-//else
-//  return ToTypedefOrErr.takeError();
+if (ExpectedDecl ToTypedefOrErr = Importer.Import_New(FromTypedef))
+  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
+else
+  return ToTypedefOrErr.takeError();
   }
   return Error::success();
 }
@@ -3437,9 +3412,6 @@
 // FIXME here we leak `NamedChain` which is allocated before
 return ToIndirectField;
 
-  for (const auto *Attr : D->attrs())
-ToIndirectField->addAttr(Importer.Import(Attr));
-
   ToIndirectField->setAccess(D->getAccess());
   ToIndirectField->setLexicalDeclContext(LexicalDC);
   LexicalDC->addDeclInternal(ToIndirectField);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175821.
balazske added a comment.

- Changed every use of ASTImporter::Import to Import_New


Repository:
  rC Clang

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

https://reviews.llvm.org/D53757

Files:
  lib/AST/ASTImporter.cpp
  lib/AST/ExternalASTMerger.cpp
  lib/CrossTU/CrossTranslationUnit.cpp
  lib/Frontend/ASTMerge.cpp
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -75,8 +75,8 @@
 class TestImportBase : public ParameterizedTestsFixture {
 
   template 
-  NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter &Importer,
-  NodeType Node) {
+  llvm::Expected importNode(ASTUnit *From, ASTUnit *To,
+  ASTImporter &Importer, NodeType Node) {
 ASTContext &ToCtx = To->getASTContext();
 
 // Add 'From' file to virtual file system so importer can 'find' it
@@ -86,17 +86,19 @@
 createVirtualFileIfNeeded(To, FromFileName,
   From->getBufferForFile(FromFileName));
 
-auto Imported = Importer.Import(Node);
+auto Imported = Importer.Import_New(Node);
 
-// This should dump source locations and assert if some source locations
-// were not imported.
-SmallString<1024> ImportChecker;
-llvm::raw_svector_ostream ToNothing(ImportChecker);
-ToCtx.getTranslationUnitDecl()->print(ToNothing);
+if (Imported) {
+  // This should dump source locations and assert if some source locations
+  // were not imported.
+  SmallString<1024> ImportChecker;
+  llvm::raw_svector_ostream ToNothing(ImportChecker);
+  ToCtx.getTranslationUnitDecl()->print(ToNothing);
 
-// This traverses the AST to catch certain bugs like poorly or not
-// implemented subtrees.
-Imported->dump(ToNothing);
+  // This traverses the AST to catch certain bugs like poorly or not
+  // implemented subtrees.
+  (*Imported)->dump(ToNothing);
+}
 
 return Imported;
   }
@@ -137,11 +139,14 @@
 EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher));
 
 auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport);
-if (!Imported)
-  return testing::AssertionFailure() << "Import failed, nullptr returned!";
-
+if (!Imported) {
+  llvm::Error Err = Imported.takeError();
+  return testing::AssertionFailure()
+ << "Import failed, error: \"" << Err << "\"!";
+  llvm::consumeError(std::move(Err));
+}
 
-return Verifier.match(Imported, WrapperMatcher);
+return Verifier.match(*Imported, WrapperMatcher);
   }
 
   template 
@@ -260,7 +265,9 @@
   EXPECT_TRUE(FoundDecl.size() == 1);
   const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl);
   auto Imported = importNode(From, To, *ImporterRef, ToImport);
-  EXPECT_TRUE(Imported);
+  EXPECT_TRUE(static_cast(Imported));
+  if (!Imported)
+llvm::consumeError(Imported.takeError());
 }
 
 // Find the declaration and import it.
@@ -320,12 +327,22 @@
 
 Decl *import(ASTUnit *ToAST, Decl *FromDecl) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromDecl);
- }
+  if (auto ImportedOrErr = Importer->Import_New(FromDecl))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return nullptr;
+  }
+}
 
 QualType import(ASTUnit *ToAST, QualType FromType) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromType);
+  if (auto ImportedOrErr = Importer->Import_New(FromType))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return QualType{};
+  }
 }
   };
 
Index: lib/Frontend/ASTMerge.cpp
===
--- lib/Frontend/ASTMerge.cpp
+++ lib/Frontend/ASTMerge.cpp
@@ -65,11 +65,13 @@
   if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list"))
 continue;
 
-  Decl *ToD = Importer.Import(D);
+  llvm::Expected ToDOrError = Importer.Import_New(D);
 
-  if (ToD) {
-DeclGroupRef DGR(ToD);
+  if (ToDOrError) {
+DeclGroupRef DGR(*ToDOrError);
 CI.getASTConsumer().HandleTopLevelDecl(DGR);
+  } else {
+llvm::consumeError(ToDOrError.takeError());
   }
 }
   }
Index: lib/CrossTU/CrossTranslationUnit.cpp
===
--- lib/CrossTU/CrossTranslationUnit.cpp
+++ lib/CrossTU/CrossTranslationUnit.cpp
@@ -245,11 +245,28 @@
 
 llvm::Expected
 CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) {
-  ASTImporter &Importer = getOrCreateASTImporter(FD->getASTContext());
-  auto *ToDecl =
-  cast(Importer.Import(const_cast(FD)));
-  assert(T

[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175822.
balazske added a comment.

Removing previous wrong update.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53757

Files:
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -168,32 +168,20 @@
 // Use this to import pointers of specific type.
 template 
 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
-  auto ToI = Importer.Import(From);
-  if (!ToI && From)
-return make_error();
-  To = cast_or_null(ToI);
-  return Error::success();
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (ToOrErr) {
-  //  To = cast_or_null(*ToOrErr);
-  //}
-  //return ToOrErr.takeError();
+  auto ToOrErr = Importer.Import_New(From);
+  if (ToOrErr)
+To = cast_or_null(*ToOrErr);
+  return ToOrErr.takeError();
 }
 
 // Call the import function of ASTImporter for a baseclass of type `T` and
 // cast the return value to `T`.
 template 
 Expected import(T *From) {
-  auto *To = Importer.Import(From);
-  if (!To && From)
-return make_error();
-  return cast_or_null(To);
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (!ToOrErr)
-  //  return ToOrErr.takeError();
-  //return cast_or_null(*ToOrErr);
+  auto ToOrErr = Importer.Import_New(From);
+  if (!ToOrErr)
+return ToOrErr.takeError();
+  return cast_or_null(*ToOrErr);
 }
 
 template 
@@ -204,13 +192,7 @@
 // Call the import function of ASTImporter for type `T`.
 template 
 Expected import(const T &From) {
-  T To = Importer.Import(From);
-  T DefaultT;
-  if (To == DefaultT && !(From == DefaultT))
-return make_error();
-  return To;
-  // FIXME: This should be the final code.
-  //return Importer.Import(From);
+  return Importer.Import_New(From);
 }
 
 template 
@@ -300,8 +282,15 @@
   Importer.MapImported(FromD, ToD);
   ToD->IdentifierNamespace = FromD->IdentifierNamespace;
   if (FromD->hasAttrs())
-for (const Attr *FromAttr : FromD->getAttrs())
-  ToD->addAttr(Importer.Import(FromAttr));
+for (const Attr *FromAttr : FromD->getAttrs()) {
+  // FIXME: Return of the error here is not possible until store of
+  // import errors is implemented.
+  auto ToAttrOrErr = import(FromAttr);
+  if (ToAttrOrErr)
+ToD->addAttr(*ToAttrOrErr);
+  else
+llvm::consumeError(ToAttrOrErr.takeError());
+}
   if (FromD->isUsed())
 ToD->setIsUsed();
   if (FromD->isImplicit())
@@ -647,15 +636,6 @@
 FunctionDecl *FromFD);
   };
 
-// FIXME: Temporary until every import returns Expected.
-template <>
-Expected ASTNodeImporter::import(const TemplateName &From) {
-  TemplateName To = Importer.Import(From);
-  if (To.isNull() && !From.isNull())
-return make_error();
-  return To;
-}
-
 template 
 Error ASTNodeImporter::ImportTemplateArgumentListInfo(
 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
@@ -1693,15 +1673,10 @@
 static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
ASTImporter &Importer) {
   if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
-Decl *ToTypedef = Importer.Import(FromTypedef);
-if (!ToTypedef)
-  return make_error();
-To->setTypedefNameForAnonDecl(cast(ToTypedef));
-// FIXME: This should be the final code.
-//if (Expected ToTypedefOrErr = Importer.Import(FromTypedef))
-//  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
-//else
-//  return ToTypedefOrErr.takeError();
+if (ExpectedDecl ToTypedefOrErr = Importer.Import_New(FromTypedef))
+  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
+else
+  return ToTypedefOrErr.takeError();
   }
   return Error::success();
 }
@@ -3437,9 +3412,6 @@
 // FIXME here we leak `NamedChain` which is allocated before
 return ToIndirectField;
 
-  for (const auto *Attr : D->attrs())
-ToIndirectField->addAttr(Importer.Import(Attr));
-
   ToIndirectField->setAccess(D->getAccess());
   ToIndirectField->setLexicalDeclContext(LexicalDC);
   LexicalDC->addDeclInternal(ToIndirectField);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New

2018-11-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, gamesh411, Szelethus, martong, dkrupp.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: shafik.

Repository:
  rC Clang

https://reviews.llvm.org/D55049

Files:
  lib/AST/ExternalASTMerger.cpp
  lib/CrossTU/CrossTranslationUnit.cpp
  lib/Frontend/ASTMerge.cpp
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -75,8 +75,8 @@
 class TestImportBase : public ParameterizedTestsFixture {
 
   template 
-  NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter &Importer,
-  NodeType Node) {
+  llvm::Expected importNode(ASTUnit *From, ASTUnit *To,
+  ASTImporter &Importer, NodeType Node) {
 ASTContext &ToCtx = To->getASTContext();
 
 // Add 'From' file to virtual file system so importer can 'find' it
@@ -86,17 +86,19 @@
 createVirtualFileIfNeeded(To, FromFileName,
   From->getBufferForFile(FromFileName));
 
-auto Imported = Importer.Import(Node);
+auto Imported = Importer.Import_New(Node);
 
-// This should dump source locations and assert if some source locations
-// were not imported.
-SmallString<1024> ImportChecker;
-llvm::raw_svector_ostream ToNothing(ImportChecker);
-ToCtx.getTranslationUnitDecl()->print(ToNothing);
+if (Imported) {
+  // This should dump source locations and assert if some source locations
+  // were not imported.
+  SmallString<1024> ImportChecker;
+  llvm::raw_svector_ostream ToNothing(ImportChecker);
+  ToCtx.getTranslationUnitDecl()->print(ToNothing);
 
-// This traverses the AST to catch certain bugs like poorly or not
-// implemented subtrees.
-Imported->dump(ToNothing);
+  // This traverses the AST to catch certain bugs like poorly or not
+  // implemented subtrees.
+  (*Imported)->dump(ToNothing);
+}
 
 return Imported;
   }
@@ -137,11 +139,14 @@
 EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher));
 
 auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport);
-if (!Imported)
-  return testing::AssertionFailure() << "Import failed, nullptr returned!";
-
+if (!Imported) {
+  llvm::Error Err = Imported.takeError();
+  return testing::AssertionFailure()
+ << "Import failed, error: \"" << Err << "\"!";
+  llvm::consumeError(std::move(Err));
+}
 
-return Verifier.match(Imported, WrapperMatcher);
+return Verifier.match(*Imported, WrapperMatcher);
   }
 
   template 
@@ -260,7 +265,9 @@
   EXPECT_TRUE(FoundDecl.size() == 1);
   const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl);
   auto Imported = importNode(From, To, *ImporterRef, ToImport);
-  EXPECT_TRUE(Imported);
+  EXPECT_TRUE(static_cast(Imported));
+  if (!Imported)
+llvm::consumeError(Imported.takeError());
 }
 
 // Find the declaration and import it.
@@ -320,12 +327,22 @@
 
 Decl *import(ASTUnit *ToAST, Decl *FromDecl) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromDecl);
- }
+  if (auto ImportedOrErr = Importer->Import_New(FromDecl))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return nullptr;
+  }
+}
 
 QualType import(ASTUnit *ToAST, QualType FromType) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromType);
+  if (auto ImportedOrErr = Importer->Import_New(FromType))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return QualType{};
+  }
 }
   };
 
Index: lib/Frontend/ASTMerge.cpp
===
--- lib/Frontend/ASTMerge.cpp
+++ lib/Frontend/ASTMerge.cpp
@@ -65,11 +65,13 @@
   if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list"))
 continue;
 
-  Decl *ToD = Importer.Import(D);
+  llvm::Expected ToDOrError = Importer.Import_New(D);
 
-  if (ToD) {
-DeclGroupRef DGR(ToD);
+  if (ToDOrError) {
+DeclGroupRef DGR(*ToDOrError);
 CI.getASTConsumer().HandleTopLevelDecl(DGR);
+  } else {
+llvm::consumeError(ToDOrError.takeError());
   }
 }
   }
Index: lib/CrossTU/CrossTranslationUnit.cpp
===
--- lib/CrossTU/CrossTranslationUnit.cpp
+++ lib/CrossTU/CrossTranslationUnit.cpp
@@ -245,11 +245,28 @@
 
 llvm::Expected
 CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) {
-  ASTImporter &Importer = getOrCreateASTImporter(FD->getASTContext());
-  auto *ToDecl =
-  cast(Importer.Import(const_cast(FD)));
-  assert(ToDecl->hasBody());
   assert(FD->hasBody() &&

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2018-11-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske reopened this revision.
balazske added a comment.
This revision is now accepted and ready to land.

Reopening to fix failing lldb tests.


Repository:
  rL LLVM

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

https://reviews.llvm.org/D53818



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


[PATCH] D55049: Changed every use of ASTImporter::Import to Import_New

2018-11-29 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 175864.
balazske added a comment.

- Changed some missing Import calls.


Repository:
  rC Clang

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

https://reviews.llvm.org/D55049

Files:
  lib/AST/ASTImporter.cpp
  lib/AST/ExternalASTMerger.cpp
  lib/CrossTU/CrossTranslationUnit.cpp
  lib/Frontend/ASTMerge.cpp
  unittests/AST/ASTImporterTest.cpp

Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -75,8 +75,8 @@
 class TestImportBase : public ParameterizedTestsFixture {
 
   template 
-  NodeType importNode(ASTUnit *From, ASTUnit *To, ASTImporter &Importer,
-  NodeType Node) {
+  llvm::Expected importNode(ASTUnit *From, ASTUnit *To,
+  ASTImporter &Importer, NodeType Node) {
 ASTContext &ToCtx = To->getASTContext();
 
 // Add 'From' file to virtual file system so importer can 'find' it
@@ -86,17 +86,19 @@
 createVirtualFileIfNeeded(To, FromFileName,
   From->getBufferForFile(FromFileName));
 
-auto Imported = Importer.Import(Node);
+auto Imported = Importer.Import_New(Node);
 
-// This should dump source locations and assert if some source locations
-// were not imported.
-SmallString<1024> ImportChecker;
-llvm::raw_svector_ostream ToNothing(ImportChecker);
-ToCtx.getTranslationUnitDecl()->print(ToNothing);
+if (Imported) {
+  // This should dump source locations and assert if some source locations
+  // were not imported.
+  SmallString<1024> ImportChecker;
+  llvm::raw_svector_ostream ToNothing(ImportChecker);
+  ToCtx.getTranslationUnitDecl()->print(ToNothing);
 
-// This traverses the AST to catch certain bugs like poorly or not
-// implemented subtrees.
-Imported->dump(ToNothing);
+  // This traverses the AST to catch certain bugs like poorly or not
+  // implemented subtrees.
+  (*Imported)->dump(ToNothing);
+}
 
 return Imported;
   }
@@ -137,11 +139,14 @@
 EXPECT_TRUE(Verifier.match(ToImport, WrapperMatcher));
 
 auto Imported = importNode(FromAST.get(), ToAST.get(), Importer, ToImport);
-if (!Imported)
-  return testing::AssertionFailure() << "Import failed, nullptr returned!";
-
+if (!Imported) {
+  llvm::Error Err = Imported.takeError();
+  return testing::AssertionFailure()
+ << "Import failed, error: \"" << Err << "\"!";
+  llvm::consumeError(std::move(Err));
+}
 
-return Verifier.match(Imported, WrapperMatcher);
+return Verifier.match(*Imported, WrapperMatcher);
   }
 
   template 
@@ -260,7 +265,9 @@
   EXPECT_TRUE(FoundDecl.size() == 1);
   const Decl *ToImport = selectFirst(DeclToImportID, FoundDecl);
   auto Imported = importNode(From, To, *ImporterRef, ToImport);
-  EXPECT_TRUE(Imported);
+  EXPECT_TRUE(static_cast(Imported));
+  if (!Imported)
+llvm::consumeError(Imported.takeError());
 }
 
 // Find the declaration and import it.
@@ -320,12 +327,22 @@
 
 Decl *import(ASTUnit *ToAST, Decl *FromDecl) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromDecl);
- }
+  if (auto ImportedOrErr = Importer->Import_New(FromDecl))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return nullptr;
+  }
+}
 
 QualType import(ASTUnit *ToAST, QualType FromType) {
   lazyInitImporter(ToAST);
-  return Importer->Import(FromType);
+  if (auto ImportedOrErr = Importer->Import_New(FromType))
+return *ImportedOrErr;
+  else {
+llvm::consumeError(ImportedOrErr.takeError());
+return QualType{};
+  }
 }
   };
 
Index: lib/Frontend/ASTMerge.cpp
===
--- lib/Frontend/ASTMerge.cpp
+++ lib/Frontend/ASTMerge.cpp
@@ -65,11 +65,13 @@
   if (II->isStr("__va_list_tag") || II->isStr("__builtin_va_list"))
 continue;
 
-  Decl *ToD = Importer.Import(D);
+  llvm::Expected ToDOrError = Importer.Import_New(D);
 
-  if (ToD) {
-DeclGroupRef DGR(ToD);
+  if (ToDOrError) {
+DeclGroupRef DGR(*ToDOrError);
 CI.getASTConsumer().HandleTopLevelDecl(DGR);
+  } else {
+llvm::consumeError(ToDOrError.takeError());
   }
 }
   }
Index: lib/CrossTU/CrossTranslationUnit.cpp
===
--- lib/CrossTU/CrossTranslationUnit.cpp
+++ lib/CrossTU/CrossTranslationUnit.cpp
@@ -245,11 +245,28 @@
 
 llvm::Expected
 CrossTranslationUnitContext::importDefinition(const FunctionDecl *FD) {
-  ASTImporter &Importer = getOrCreateASTImporter(FD->getASTContext());
-  auto *ToDecl =
-  cast(Importer.Import(const_cast(FD)));
-  assert(ToDecl->hasBody());
 

[PATCH] D55280: [CTU] Remove redundant error check

2018-12-05 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: include/clang/CrossTU/CrossTranslationUnit.h:121
+  /// \return Returns a pointer to the ASTUnit that contains the definition of
+  /// the looked up function. The pointer should not be a nullptr.
   ///

Return value description still not accurate: It returns the `Expected` object, 
not the pointer itself.



Comment at: lib/CrossTU/CrossTranslationUnit.cpp:147
 
 llvm::Expected
 CrossTranslationUnitContext::getCrossTUDefinition(const FunctionDecl *FD,

Szelethus wrote:
> Would it be worth to add a comment that this function never returns with 
> `nullptr` on success?
Even on failure not. Failure should be `Error`, success is a non-null pointer.



Comment at: lib/CrossTU/CrossTranslationUnit.cpp:238
   }
+  assert(Unit);
   return Unit;

Add explanation text to the assert?


Repository:
  rC Clang

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

https://reviews.llvm.org/D55280



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


[PATCH] D55358: [ASTImporter] Fix import of NestedNameSpecifierLoc.

2018-12-06 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, gamesh411, Szelethus, martong, dkrupp.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: shafik.

Import type location in case of TypeSpec and TypeSpecWithTemplate.
Without this fix the imported NespedNameSpecifierLoc will have an
invalid begin location.


Repository:
  rC Clang

https://reviews.llvm.org/D55358

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


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1179,6 +1179,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
   auto From =
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8017,7 +8017,8 @@
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0),
+Import(NNS.getTypeLoc().getBeginLoc()));
   Builder.Extend(getToContext(),
  Import(NNS.getLocalBeginLoc()),
  TSI->getTypeLoc(),


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1179,6 +1179,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterTestBase, ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
   auto From =
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8017,7 +8017,8 @@
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0),
+Import(NNS.getTypeLoc().getBeginLoc()));
   Builder.Extend(getToContext(),
  Import(NNS.getLocalBeginLoc()),
  TSI->getTypeLoc(),
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D57590: [ASTImporter] Improve import of FileID.

2019-02-27 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Currently there is no direct test for `ASTImporter` `FileID` (and other 
non-Decl) import. These are tested indirectly by other import tests. There is 
something that fails in a macOS LLDB test without this.


Repository:
  rC Clang

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

https://reviews.llvm.org/D57590



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


[PATCH] D57590: [ASTImporter] Improve import of FileID.

2019-02-27 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC355000: [ASTImporter] Improve import of FileID. (authored by 
balazske, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D57590?vs=184760&id=188553#toc

Repository:
  rC Clang

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

https://reviews.llvm.org/D57590

Files:
  lib/AST/ASTImporter.cpp


Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8289,14 +8289,21 @@
   // than mmap the files several times.
   const FileEntry *Entry =
   ToFileManager.getFile(Cache->OrigEntry->getName());
-  if (!Entry)
-return {};
-  ToID = ToSM.createFileID(Entry, ToIncludeLoc,
-   FromSLoc.getFile().getFileCharacteristic());
-} else {
+  // FIXME: The filename may be a virtual name that does probably not
+  // point to a valid file and we get no Entry here. In this case try with
+  // the memory buffer below.
+  if (Entry)
+ToID = ToSM.createFileID(Entry, ToIncludeLoc,
+ FromSLoc.getFile().getFileCharacteristic());
+}
+if (ToID.isInvalid()) {
   // FIXME: We want to re-use the existing MemoryBuffer!
-  const llvm::MemoryBuffer *FromBuf =
-  Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
+  bool Invalid = true;
+  const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
+  FromContext.getDiagnostics(), FromSM, SourceLocation{}, &Invalid);
+  if (!FromBuf || Invalid)
+return {};
+
   std::unique_ptr ToBuf =
   llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
FromBuf->getBufferIdentifier());
@@ -8305,6 +8312,8 @@
 }
   }
 
+  assert(ToID.isValid() && "Unexpected invalid fileID was created.");
+
   ImportedFileIDs[FromID] = ToID;
   return ToID;
 }


Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8289,14 +8289,21 @@
   // than mmap the files several times.
   const FileEntry *Entry =
   ToFileManager.getFile(Cache->OrigEntry->getName());
-  if (!Entry)
-return {};
-  ToID = ToSM.createFileID(Entry, ToIncludeLoc,
-   FromSLoc.getFile().getFileCharacteristic());
-} else {
+  // FIXME: The filename may be a virtual name that does probably not
+  // point to a valid file and we get no Entry here. In this case try with
+  // the memory buffer below.
+  if (Entry)
+ToID = ToSM.createFileID(Entry, ToIncludeLoc,
+ FromSLoc.getFile().getFileCharacteristic());
+}
+if (ToID.isInvalid()) {
   // FIXME: We want to re-use the existing MemoryBuffer!
-  const llvm::MemoryBuffer *FromBuf =
-  Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
+  bool Invalid = true;
+  const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
+  FromContext.getDiagnostics(), FromSM, SourceLocation{}, &Invalid);
+  if (!FromBuf || Invalid)
+return {};
+
   std::unique_ptr ToBuf =
   llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
FromBuf->getBufferIdentifier());
@@ -8305,6 +8312,8 @@
 }
   }
 
+  assert(ToID.isValid() && "Unexpected invalid fileID was created.");
+
   ImportedFileIDs[FromID] = ToID;
   return ToID;
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D58743: Handle built-in when importing SourceLocation and FileID

2019-02-28 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: include/clang/AST/ASTImporter.h:342
 // FIXME: Remove this version.
-FileID Import(FileID);
+FileID Import(FileID, bool isBuiltin=false);
 

teemperor wrote:
> `IsBuiltin`, not `isBuiltin`
`IsBuiltin = false` should be the correct formatting.



Comment at: lib/AST/ASTImporter.cpp:8250
 
 Expected ASTImporter::Import_New(FileID FromID) {
   FileID ToID = Import(FromID);

The new parameter should be added here too.



Comment at: lib/AST/ASTImporter.cpp:8284
+
+if (!isBuiltin) {
+   // Include location of this file.

The `Cache` can be moved into this block and the block to `else if`.



Comment at: lib/AST/ASTImporter.cpp:8301
+ToID = ToSM.createFileID(Entry, ToIncludeLoc,
+ 
FromSLoc.getFile().getFileCharacteristic());
+}

Is it possible that in the `isBuiltin` true case this part of the code does run 
(always) without assertion or other error and the result is always an invalid 
`ToID`? (If yes the whole change is not needed, so I want to know what was the 
reason for this change, was there any crash or bug.)


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

https://reviews.llvm.org/D58743



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


[PATCH] D58743: Handle built-in when importing SourceLocation and FileID

2019-03-01 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Looks good now.


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

https://reviews.llvm.org/D58743



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


[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2019-03-07 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 189696.
balazske added a comment.
Herald added a reviewer: martong.
Herald added a subscriber: jdoerfert.

- Small style corrections.


Repository:
  rC Clang

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

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -134,25 +134,6 @@
   To->setIsUsed();
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7674,13 +7655,6 @@
 
 ASTImporter::~ASTImporter() = default;
 
-Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-
 Optional ASTImporter::getFieldIndex(Decl *F) {
   assert(F && (isa(*F) || isa(*F)) &&
   "Try to get field index for non-field.");
@@ -7732,9 +7706,9 @@
   LookupTable->add(ToND);
 }
 
-QualType ASTImporter::Import(QualType FromT) {
+Expected ASTImporter::Import_New(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7747,46 +7721,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
   auto Pos = ImportedDecls.find(FromD);
@@ -7804,12 +7796,6 @@
 }
 
 Expected ASTImporter::Import_New(Decl *FromD) {
-  Decl *ToD = Import(FromD);
-  if (!ToD && FromD)
-return llvm::make_error();
-  return ToD;
-}
-Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7823,12 +7809,10 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr = Importer.Visit(FromD);
-  if (!ToDOrErr) {
-llvm::consumeError(ToDOrErr.takeError());
-return nullptr;
-  }

[PATCH] D53818: [ASTImporter] Changed use of Import to Import_New in ASTImporter.

2019-03-07 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC355598: [ASTImporter] Changed use of Import to Import_New in 
ASTImporter. (authored by balazske, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D53818?vs=189696&id=189704#toc

Repository:
  rC Clang

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

https://reviews.llvm.org/D53818

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -134,25 +134,6 @@
   To->setIsUsed();
   }
 
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(SourceLocation &To, const SourceLocation &From) {
-To = Import(From);
-if (From.isValid() && To.isInvalid())
-return llvm::make_error();
-return Error::success();
-  }
-  // FIXME: Temporary until every import returns Expected.
-  template <>
-  LLVM_NODISCARD Error
-  ASTImporter::importInto(QualType &To, const QualType &From) {
-To = Import(From);
-if (!From.isNull() && To.isNull())
-return llvm::make_error();
-return Error::success();
-  }
-
   class ASTNodeImporter : public TypeVisitor,
   public DeclVisitor,
   public StmtVisitor {
@@ -7702,13 +7683,6 @@
 
 ASTImporter::~ASTImporter() = default;
 
-Expected ASTImporter::Import_New(QualType FromT) {
-  QualType ToT = Import(FromT);
-  if (ToT.isNull() && !FromT.isNull())
-return make_error();
-  return ToT;
-}
-
 Optional ASTImporter::getFieldIndex(Decl *F) {
   assert(F && (isa(*F) || isa(*F)) &&
   "Try to get field index for non-field.");
@@ -7760,9 +7734,9 @@
   LookupTable->add(ToND);
 }
 
-QualType ASTImporter::Import(QualType FromT) {
+Expected ASTImporter::Import_New(QualType FromT) {
   if (FromT.isNull())
-return {};
+return QualType{};
 
   const Type *FromTy = FromT.getTypePtr();
 
@@ -7775,46 +7749,64 @@
   // Import the type
   ASTNodeImporter Importer(*this);
   ExpectedType ToTOrErr = Importer.Visit(FromTy);
-  if (!ToTOrErr) {
-llvm::consumeError(ToTOrErr.takeError());
-return {};
-  }
+  if (!ToTOrErr)
+return ToTOrErr.takeError();
 
   // Record the imported type.
   ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
 
   return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
 }
+QualType ASTImporter::Import(QualType From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return {};
+}
 
 Expected ASTImporter::Import_New(TypeSourceInfo *FromTSI) {
-  TypeSourceInfo *ToTSI = Import(FromTSI);
-  if (!ToTSI && FromTSI)
-return llvm::make_error();
-  return ToTSI;
-}
-TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   if (!FromTSI)
 return FromTSI;
 
   // FIXME: For now we just create a "trivial" type source info based
   // on the type and a single location. Implement a real version of this.
-  QualType T = Import(FromTSI->getType());
-  if (T.isNull())
-return nullptr;
+  ExpectedType TOrErr = Import_New(FromTSI->getType());
+  if (!TOrErr)
+return TOrErr.takeError();
+  ExpectedSLoc BeginLocOrErr = Import_New(FromTSI->getTypeLoc().getBeginLoc());
+  if (!BeginLocOrErr)
+return BeginLocOrErr.takeError();
 
-  return ToContext.getTrivialTypeSourceInfo(
-  T, Import(FromTSI->getTypeLoc().getBeginLoc()));
+  return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
+}
+TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
 }
 
 Expected ASTImporter::Import_New(const Attr *FromAttr) {
-  return Import(FromAttr);
-}
-Attr *ASTImporter::Import(const Attr *FromAttr) {
   Attr *ToAttr = FromAttr->clone(ToContext);
-  // NOTE: Import of SourceRange may fail.
-  ToAttr->setRange(Import(FromAttr->getRange()));
+  if (auto ToRangeOrErr = Import_New(FromAttr->getRange()))
+ToAttr->setRange(*ToRangeOrErr);
+  else
+return ToRangeOrErr.takeError();
+
   return ToAttr;
 }
+Attr *ASTImporter::Import(const Attr *From) {
+  llvm::Expected To = Import_New(From);
+  if (To)
+return *To;
+  else
+llvm::consumeError(To.takeError());
+  return nullptr;
+}
 
 Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
   auto Pos = ImportedDecls.find(FromD);
@@ -7832,12 +7824,6 @@
 }
 
 Expected ASTImporter::Import_New(Decl *FromD) {
-  Decl *ToD = Import(FromD);
-  if (!ToD && FromD)
-return llvm::make_error();
-  return ToD;
-}
-Decl *ASTImporter::Import(Decl *FromD) {
   if (!FromD)
 return nullptr;
 
@@ -7851,12 +7837,10 @@
 return ToD;
   }
 
-  // Import the type.
+  // Import the declaration.
   ExpectedDecl ToDOrErr =

[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2019-03-08 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 189824.
balazske added a comment.

Rebase (old patch applied without changes).


Repository:
  rC Clang

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

https://reviews.llvm.org/D53757

Files:
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -148,32 +148,20 @@
 // Use this to import pointers of specific type.
 template 
 LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
-  auto ToI = Importer.Import(From);
-  if (!ToI && From)
-return make_error();
-  To = cast_or_null(ToI);
-  return Error::success();
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (ToOrErr) {
-  //  To = cast_or_null(*ToOrErr);
-  //}
-  //return ToOrErr.takeError();
+  auto ToOrErr = Importer.Import_New(From);
+  if (ToOrErr)
+To = cast_or_null(*ToOrErr);
+  return ToOrErr.takeError();
 }
 
 // Call the import function of ASTImporter for a baseclass of type `T` and
 // cast the return value to `T`.
 template 
 Expected import(T *From) {
-  auto *To = Importer.Import(From);
-  if (!To && From)
-return make_error();
-  return cast_or_null(To);
-  // FIXME: This should be the final code.
-  //auto ToOrErr = Importer.Import(From);
-  //if (!ToOrErr)
-  //  return ToOrErr.takeError();
-  //return cast_or_null(*ToOrErr);
+  auto ToOrErr = Importer.Import_New(From);
+  if (!ToOrErr)
+return ToOrErr.takeError();
+  return cast_or_null(*ToOrErr);
 }
 
 template 
@@ -184,13 +172,7 @@
 // Call the import function of ASTImporter for type `T`.
 template 
 Expected import(const T &From) {
-  T To = Importer.Import(From);
-  T DefaultT;
-  if (To == DefaultT && !(From == DefaultT))
-return make_error();
-  return To;
-  // FIXME: This should be the final code.
-  //return Importer.Import(From);
+  return Importer.Import_New(From);
 }
 
 template 
@@ -282,8 +264,15 @@
 void InitializeImportedDecl(Decl *FromD, Decl *ToD) {
   ToD->IdentifierNamespace = FromD->IdentifierNamespace;
   if (FromD->hasAttrs())
-for (const Attr *FromAttr : FromD->getAttrs())
-  ToD->addAttr(Importer.Import(FromAttr));
+for (const Attr *FromAttr : FromD->getAttrs()) {
+  // FIXME: Return of the error here is not possible until store of
+  // import errors is implemented.
+  auto ToAttrOrErr = import(FromAttr);
+  if (ToAttrOrErr)
+ToD->addAttr(*ToAttrOrErr);
+  else
+llvm::consumeError(ToAttrOrErr.takeError());
+}
   if (FromD->isUsed())
 ToD->setIsUsed();
   if (FromD->isImplicit())
@@ -635,15 +624,6 @@
 FunctionDecl *FromFD);
   };
 
-// FIXME: Temporary until every import returns Expected.
-template <>
-Expected ASTNodeImporter::import(const TemplateName &From) {
-  TemplateName To = Importer.Import(From);
-  if (To.isNull() && !From.isNull())
-return make_error();
-  return To;
-}
-
 template 
 Error ASTNodeImporter::ImportTemplateArgumentListInfo(
 SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
@@ -1684,15 +1664,10 @@
 static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
ASTImporter &Importer) {
   if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
-Decl *ToTypedef = Importer.Import(FromTypedef);
-if (!ToTypedef)
-  return make_error();
-To->setTypedefNameForAnonDecl(cast(ToTypedef));
-// FIXME: This should be the final code.
-//if (Expected ToTypedefOrErr = Importer.Import(FromTypedef))
-//  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
-//else
-//  return ToTypedefOrErr.takeError();
+if (ExpectedDecl ToTypedefOrErr = Importer.Import_New(FromTypedef))
+  To->setTypedefNameForAnonDecl(cast(*ToTypedefOrErr));
+else
+  return ToTypedefOrErr.takeError();
   }
   return Error::success();
 }
@@ -3415,9 +3390,6 @@
 // FIXME here we leak `NamedChain` which is allocated before
 return ToIndirectField;
 
-  for (const auto *Attr : D->attrs())
-ToIndirectField->addAttr(Importer.Import(Attr));
-
   ToIndirectField->setAccess(D->getAccess());
   ToIndirectField->setLexicalDeclContext(LexicalDC);
   LexicalDC->addDeclInternal(ToIndirectField);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53757: [ASTImporter] Changed use of Import to Import_New in ASTNodeImporter.

2019-03-08 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

This is the next part of the changes for error handling. D53818 
 was for `ASTImporter` functions only, this is 
for `ASTNodeImporter` (the `Import_New` functions are not used at many places 
directly because mostly the few import templates are used). The next part is 
D55049  which switches to `Import_New` in 
every other place (in clang source code only). Next part would be to use 
`Import_New` in lldb, then rename all `Import_New` to `Import` (and remove old 
`Import`).


Repository:
  rC Clang

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

https://reviews.llvm.org/D53757



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


[PATCH] D59134: [ASTImporter] Remove obsolete function ImportTemplateParameterList.

2019-03-08 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: cfe-commits, gamesh411, Szelethus, dkrupp.
Herald added a reviewer: martong.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: shafik.
Herald added a project: clang.

The ASTNodeImporter::ImportTemplateParameterList is replaced by a
template specialization of 'import' that already exists and does
(almost) the same thing.


Repository:
  rC Clang

https://reviews.llvm.org/D59134

Files:
  lib/AST/ASTImporter.cpp

Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -392,8 +392,6 @@
 Error ImportDefinition(
 ObjCProtocolDecl *From, ObjCProtocolDecl *To,
 ImportDefinitionKind Kind = IDK_Default);
-Expected ImportTemplateParameterList(
-TemplateParameterList *Params);
 Error ImportTemplateArguments(
 const TemplateArgument *FromArgs, unsigned NumFromArgs,
 SmallVectorImpl &ToArgs);
@@ -1889,40 +1887,6 @@
   return Error::success();
 }
 
-// FIXME: Remove this, use `import` instead.
-Expected ASTNodeImporter::ImportTemplateParameterList(
-TemplateParameterList *Params) {
-  SmallVector ToParams(Params->size());
-  if (Error Err = ImportContainerChecked(*Params, ToParams))
-return std::move(Err);
-
-  Expr *ToRequiresClause;
-  if (Expr *const R = Params->getRequiresClause()) {
-if (Error Err = importInto(ToRequiresClause, R))
-  return std::move(Err);
-  } else {
-ToRequiresClause = nullptr;
-  }
-
-  auto ToTemplateLocOrErr = import(Params->getTemplateLoc());
-  if (!ToTemplateLocOrErr)
-return ToTemplateLocOrErr.takeError();
-  auto ToLAngleLocOrErr = import(Params->getLAngleLoc());
-  if (!ToLAngleLocOrErr)
-return ToLAngleLocOrErr.takeError();
-  auto ToRAngleLocOrErr = import(Params->getRAngleLoc());
-  if (!ToRAngleLocOrErr)
-return ToRAngleLocOrErr.takeError();
-
-  return TemplateParameterList::Create(
-  Importer.getToContext(),
-  *ToTemplateLocOrErr,
-  *ToLAngleLocOrErr,
-  ToParams,
-  *ToRAngleLocOrErr,
-  ToRequiresClause);
-}
-
 Error ASTNodeImporter::ImportTemplateArguments(
 const TemplateArgument *FromArgs, unsigned NumFromArgs,
 SmallVectorImpl &ToArgs) {
@@ -3472,7 +3436,7 @@
   SmallVector ToTPLists(D->NumTPLists);
   auto **FromTPLists = D->getTrailingObjects();
   for (unsigned I = 0; I < D->NumTPLists; I++) {
-if (auto ListOrErr = ImportTemplateParameterList(FromTPLists[I]))
+if (auto ListOrErr = import(FromTPLists[I]))
   ToTPLists[I] = *ListOrErr;
 else
   return ListOrErr.takeError();
@@ -4907,8 +4871,7 @@
 return LocationOrErr.takeError();
 
   // Import template parameters.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -4995,8 +4958,7 @@
 return std::move(Err);
 
   // Create the class template declaration itself.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -5152,8 +5114,7 @@
 return std::move(Err);
   CanonInjType = CanonInjType.getCanonicalType();
 
-  auto ToTPListOrErr = ImportTemplateParameterList(
-  PartialSpec->getTemplateParameters());
+  auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());
   if (!ToTPListOrErr)
 return ToTPListOrErr.takeError();
 
@@ -5307,8 +5268,7 @@
 return std::move(Err);
 
   // Create the variable template declaration itself.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -5413,8 +5373,7 @@
   *FromTAArgsAsWritten, ArgInfos))
 return std::move(Err);
 
-  auto ToTPListOrErr = ImportTemplateParameterList(
-  FromPartial->getTemplateParameters());
+  auto ToTPListOrErr = import(FromPartial->getTemplateParameters());
   if (!ToTPListOrErr)
 return ToTPListOrErr.takeError();
 
@@ -5522,8 +5481,7 @@
 }
   }
 
-  auto ParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto ParamsOrErr = import(D->getTemplateParameters());
   if (!ParamsOrErr)
 return ParamsOrErr.takeError();
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D55358: [ASTImporter] Fix import of NestedNameSpecifierLoc.

2019-03-11 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 190056.
balazske added a comment.

Rebase.


Repository:
  rC Clang

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

https://reviews.llvm.org/D55358

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


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1232,6 +1232,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8092,8 +8092,11 @@
 
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
+  SourceLocation ToTLoc;
+  if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
+return std::move(Err);
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0), ToTLoc);
   Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
  ToLocalEndLoc);
   break;


Index: unittests/AST/ASTImporterTest.cpp
===
--- unittests/AST/ASTImporterTest.cpp
+++ unittests/AST/ASTImporterTest.cpp
@@ -1232,6 +1232,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
Index: lib/AST/ASTImporter.cpp
===
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8092,8 +8092,11 @@
 
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
+  SourceLocation ToTLoc;
+  if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
+return std::move(Err);
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0), ToTLoc);
   Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
  ToLocalEndLoc);
   break;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D55358: [ASTImporter] Fix import of NestedNameSpecifierLoc.

2019-03-14 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL356151: [ASTImporter] Fix import of NestedNameSpecifierLoc. 
(authored by balazske, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

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

https://reviews.llvm.org/D55358

Files:
  cfe/trunk/lib/AST/ASTImporter.cpp
  cfe/trunk/unittests/AST/ASTImporterTest.cpp


Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -8092,8 +8092,11 @@
 
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
+  SourceLocation ToTLoc;
+  if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
+return std::move(Err);
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0), ToTLoc);
   Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
  ToLocalEndLoc);
   break;
Index: cfe/trunk/unittests/AST/ASTImporterTest.cpp
===
--- cfe/trunk/unittests/AST/ASTImporterTest.cpp
+++ cfe/trunk/unittests/AST/ASTImporterTest.cpp
@@ -1232,6 +1232,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);


Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -8092,8 +8092,11 @@
 
 case NestedNameSpecifier::TypeSpec:
 case NestedNameSpecifier::TypeSpecWithTemplate: {
+  SourceLocation ToTLoc;
+  if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
+return std::move(Err);
   TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
-QualType(Spec->getAsType(), 0));
+QualType(Spec->getAsType(), 0), ToTLoc);
   Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
  ToLocalEndLoc);
   break;
Index: cfe/trunk/unittests/AST/ASTImporterTest.cpp
===
--- cfe/trunk/unittests/AST/ASTImporterTest.cpp
+++ cfe/trunk/unittests/AST/ASTImporterTest.cpp
@@ -1232,6 +1232,26 @@
   has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportBeginLocOfDeclRefExpr) {
+  Decl *FromTU = getTuDecl(
+  "class A { public: static int X; }; void f() { (void)A::X; }", Lang_CXX);
+  auto From = FirstDeclMatcher().match(
+  FromTU, functionDecl(hasName("f")));
+  ASSERT_TRUE(From);
+  ASSERT_TRUE(
+  cast(cast(From->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+  FunctionDecl *To = Import(From, Lang_CXX);
+  ASSERT_TRUE(To);
+  ASSERT_TRUE(
+  cast(cast(To->getBody())->body_front())
+  ->getSubExpr()
+  ->getBeginLoc()
+  .isValid());
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase,
ImportOfTemplatedDeclOfClassTemplateDecl) {
   Decl *FromTU = getTuDecl("template struct S{};", Lang_CXX);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D59485: [ASTImporter] Allow adding a shim to the ASTImporter

2019-03-18 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

I do not know if "Shim" is the correct name for this, maybe "Strategy" is 
better?


Repository:
  rC Clang

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

https://reviews.llvm.org/D59485



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


[PATCH] D59485: [ASTImporter] Allow adding a shim to the ASTImporter

2019-03-18 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

The replace of `Import` calls may work if the internal state of the 
`ASTImporter` is updated correctly from the 'shim' object (especially if not 
every Decl is handled by the shim). For this to work some of the state of 
`ASTImporter` that was intended to be internal must be made public, for example 
map of imported decls and lookup table. The shim may corrupt the `ASTImporter` 
state for example when the lookup table is not updated correctly. (Probably for 
the LLDB special use cases this is not a problem?)


Repository:
  rC Clang

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

https://reviews.llvm.org/D59485



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


[PATCH] D59485: [ASTImporter] Allow adding a import strategy to the ASTImporter

2019-03-19 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

It looks better now.
One "problem" is that now there is the strategy and there is the `Imported` 
function. It would be possible to unify these into a strategy that contains 
maybe a "import" and a "post-import" callback. (But this requires big changes 
in the `ASTImporter` user code.)




Comment at: clang/include/clang/AST/ASTImporter.h:154
 
+/// The Shim that should rewrite the import calls of this ASTImporter, or
+/// a nullptr of this ASTImporter has no shim.

'Shim' should be replaced with 'strategy' (and the nullptr means "no 
user-specified strategy" or "default strategy").


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

https://reviews.llvm.org/D59485



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


[PATCH] D59485: [ASTImporter] Allow adding a import strategy to the ASTImporter

2019-03-19 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Another observation: The `Import` function of the strategy now has no way to 
return an error. An even better version of it would be to include the 
possibility of import error (with `ImportError`, or other error type). Or the 
"PreImport" function could indicate if the Decl is handled by the strategy, and 
`Import` is called only if yes and `Import` can return an `Expected`. 
(The PostImport is called for every successfully imported Decl.)


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

https://reviews.llvm.org/D59485



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


[PATCH] D59485: [ASTImporter] Allow adding a import strategy to the ASTImporter

2019-03-19 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

By the way if the `Import` of the strategy uses recursive import of other 
things this can cause same problems as it was in `ASTImporter` before the 
`GetImportedOrCreateDecl` was introduced. So this should be avoided or 
something similar to `GetImportedOrCreateDecl` must be performed, maybe that 
function can be made public somehow.

But if this strategy is used only for special cases like in the test case 
(replace a specific Decl with something other) probably implementing this 
functionality in another way is a more simple solution.


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

https://reviews.llvm.org/D59485



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


[PATCH] D59595: Remove the unused return value in ASTImporter::Imported [NFC]

2019-03-20 Thread Balázs Kéri via Phabricator via cfe-commits
balazske accepted this revision.
balazske added a comment.
This revision is now accepted and ready to land.

I would prefer an observer-like solution but I am not against this change.


Repository:
  rC Clang

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

https://reviews.llvm.org/D59595



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


[PATCH] D59134: [ASTImporter] Remove obsolete function ImportTemplateParameterList.

2019-03-20 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL356564: [ASTImporter] Remove obsolete function 
ImportTemplateParameterList. (authored by balazske, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D59134?vs=189855&id=191502#toc

Repository:
  rL LLVM

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

https://reviews.llvm.org/D59134

Files:
  cfe/trunk/lib/AST/ASTImporter.cpp

Index: cfe/trunk/lib/AST/ASTImporter.cpp
===
--- cfe/trunk/lib/AST/ASTImporter.cpp
+++ cfe/trunk/lib/AST/ASTImporter.cpp
@@ -402,8 +402,6 @@
 Error ImportDefinition(
 ObjCProtocolDecl *From, ObjCProtocolDecl *To,
 ImportDefinitionKind Kind = IDK_Default);
-Expected ImportTemplateParameterList(
-TemplateParameterList *Params);
 Error ImportTemplateArguments(
 const TemplateArgument *FromArgs, unsigned NumFromArgs,
 SmallVectorImpl &ToArgs);
@@ -1899,40 +1897,6 @@
   return Error::success();
 }
 
-// FIXME: Remove this, use `import` instead.
-Expected ASTNodeImporter::ImportTemplateParameterList(
-TemplateParameterList *Params) {
-  SmallVector ToParams(Params->size());
-  if (Error Err = ImportContainerChecked(*Params, ToParams))
-return std::move(Err);
-
-  Expr *ToRequiresClause;
-  if (Expr *const R = Params->getRequiresClause()) {
-if (Error Err = importInto(ToRequiresClause, R))
-  return std::move(Err);
-  } else {
-ToRequiresClause = nullptr;
-  }
-
-  auto ToTemplateLocOrErr = import(Params->getTemplateLoc());
-  if (!ToTemplateLocOrErr)
-return ToTemplateLocOrErr.takeError();
-  auto ToLAngleLocOrErr = import(Params->getLAngleLoc());
-  if (!ToLAngleLocOrErr)
-return ToLAngleLocOrErr.takeError();
-  auto ToRAngleLocOrErr = import(Params->getRAngleLoc());
-  if (!ToRAngleLocOrErr)
-return ToRAngleLocOrErr.takeError();
-
-  return TemplateParameterList::Create(
-  Importer.getToContext(),
-  *ToTemplateLocOrErr,
-  *ToLAngleLocOrErr,
-  ToParams,
-  *ToRAngleLocOrErr,
-  ToRequiresClause);
-}
-
 Error ASTNodeImporter::ImportTemplateArguments(
 const TemplateArgument *FromArgs, unsigned NumFromArgs,
 SmallVectorImpl &ToArgs) {
@@ -3479,7 +3443,7 @@
   SmallVector ToTPLists(D->NumTPLists);
   auto **FromTPLists = D->getTrailingObjects();
   for (unsigned I = 0; I < D->NumTPLists; I++) {
-if (auto ListOrErr = ImportTemplateParameterList(FromTPLists[I]))
+if (auto ListOrErr = import(FromTPLists[I]))
   ToTPLists[I] = *ListOrErr;
 else
   return ListOrErr.takeError();
@@ -4914,8 +4878,7 @@
 return LocationOrErr.takeError();
 
   // Import template parameters.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -5002,8 +4965,7 @@
 return std::move(Err);
 
   // Create the class template declaration itself.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -5135,8 +5097,7 @@
   return std::move(Err);
 CanonInjType = CanonInjType.getCanonicalType();
 
-auto ToTPListOrErr = ImportTemplateParameterList(
-PartialSpec->getTemplateParameters());
+auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());
 if (!ToTPListOrErr)
   return ToTPListOrErr.takeError();
 
@@ -5290,8 +5251,7 @@
 return std::move(Err);
 
   // Create the variable template declaration itself.
-  auto TemplateParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto TemplateParamsOrErr = import(D->getTemplateParameters());
   if (!TemplateParamsOrErr)
 return TemplateParamsOrErr.takeError();
 
@@ -5396,8 +5356,7 @@
   *FromTAArgsAsWritten, ArgInfos))
 return std::move(Err);
 
-  auto ToTPListOrErr = ImportTemplateParameterList(
-  FromPartial->getTemplateParameters());
+  auto ToTPListOrErr = import(FromPartial->getTemplateParameters());
   if (!ToTPListOrErr)
 return ToTPListOrErr.takeError();
 
@@ -5505,8 +5464,7 @@
 }
   }
 
-  auto ParamsOrErr = ImportTemplateParameterList(
-  D->getTemplateParameters());
+  auto ParamsOrErr = import(D->getTemplateParameters());
   if (!ParamsOrErr)
 return ParamsOrErr.takeError();
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D59485: [ASTImporter] Add an ImportInternal method to allow customizing Import behavior.

2019-03-22 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: clang/lib/AST/ASTImporter.cpp:7738
+Expected ASTImporter::ImportInternal(Decl *FromD) {
+  // Import the declaration.
+  ASTNodeImporter Importer(*this);

Comment can be better: Import it using ASTNodeImporter.



Comment at: clang/unittests/AST/ASTImporterTest.cpp:581
+struct RedirectingImporter : public ASTImporter {
+  using ASTImporter::ASTImporter;
+  // Returns a ImporterConstructor that constructs this class.

Is this `using` needed?



Comment at: clang/unittests/AST/ASTImporterTest.cpp:583
+  // Returns a ImporterConstructor that constructs this class.
+  static ASTImporterOptionSpecificTestBase::ImporterConstructor
+  getConstructor() {

Is it possible to make this a static variable instead of function?



Comment at: clang/unittests/AST/ASTImporterTest.cpp:588
+  bool MinimalImport, ASTImporterLookupTable *LookupTabl) {
+  return static_cast(
+  new RedirectingImporter(ToContext, ToFileManager, FromContext,

The `static_cast` should not be needed.


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

https://reviews.llvm.org/D59485



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


[PATCH] D59485: [ASTImporter] Add an ImportInternal method to allow customizing Import behavior.

2019-03-22 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added inline comments.



Comment at: clang/unittests/AST/ASTImporterTest.cpp:583
+  // Returns a ImporterConstructor that constructs this class.
+  static ASTImporterOptionSpecificTestBase::ImporterConstructor
+  getConstructor() {

balazske wrote:
> Is it possible to make this a static variable instead of function?
Another small thing: The comment above is now not updated ("Returns").



Comment at: clang/unittests/AST/ASTImporterTest.cpp:348
+
+void setImporter(std::unique_ptr I) {
+  Importer = std::move(I);

This function is not needed?



Comment at: clang/unittests/AST/ASTImporterTest.cpp:482
 
+  ASTImporter &getImporter(Decl *From, Language ToLang) {
+lazyInitToAST(ToLang, "", OutputFileName);

This is unused, can be removed.


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

https://reviews.llvm.org/D59485



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


  1   2   3   4   5   6   7   8   9   10   >