[ASTImporter] Implement missing VisitAccessSpecDecl function in ASTImporter class.

Patch by Elisavet Sakellari!

llvm-svn: 261274
This commit is contained in:
Argyrios Kyrtzidis 2016-02-18 23:08:36 +00:00
parent 9b6dcc211a
commit 544ea71cd7
4 changed files with 36 additions and 8 deletions

View File

@ -130,6 +130,7 @@ namespace clang {
bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
Decl *VisitDecl(Decl *D);
Decl *VisitAccessSpecDecl(AccessSpecDecl *D);
Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
Decl *VisitNamespaceDecl(NamespaceDecl *D);
Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
@ -2316,6 +2317,31 @@ Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
return ToD;
}
Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
SourceLocation Loc = Importer.Import(D->getLocation());
SourceLocation ColonLoc = Importer.Import(D->getColonLoc());
// Import the context of this declaration.
DeclContext *DC = Importer.ImportContext(D->getDeclContext());
if (!DC)
return nullptr;
AccessSpecDecl *accessSpecDecl
= AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(),
DC, Loc, ColonLoc);
if (!accessSpecDecl)
return nullptr;
// Lexical DeclContext and Semantic DeclContext
// is always the same for the accessSpec.
accessSpecDecl->setLexicalDeclContext(DC);
DC->addDeclInternal(accessSpecDecl);
return accessSpecDecl;
}
Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
// Import the major distinguishing characteristics of this namespace.
DeclContext *DC, *LexicalDC;

View File

@ -1,5 +1,6 @@
struct A {
int x;
public:
int x;
};
struct B : A {

View File

@ -1,5 +1,6 @@
struct A {
int x;
public:
int x;
};
struct B : A {

View File

@ -3,12 +3,12 @@
// RUN: %clang_cc1 -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 | FileCheck %s
// RUN: %clang_cc1 -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 -Wno-odr -Werror
// CHECK: class1.cpp:5:8: warning: type 'B' has incompatible definitions in different translation units
// CHECK: class1.cpp:6:9: note: field 'y' has type 'float' here
// CHECK: class2.cpp:6:7: note: field 'y' has type 'int' here
// CHECK: class1.cpp:6:8: warning: type 'B' has incompatible definitions in different translation units
// CHECK: class1.cpp:7:9: note: field 'y' has type 'float' here
// CHECK: class2.cpp:7:7: note: field 'y' has type 'int' here
// FIXME: we should also complain about mismatched types on the method
// CHECK: class1.cpp:17:6: warning: type 'E' has incompatible definitions in different translation units
// CHECK: class1.cpp:18:3: note: enumerator 'b' with value 1 here
// CHECK: class2.cpp:11:3: note: enumerator 'a' with value 0 here
// CHECK: class1.cpp:18:6: warning: type 'E' has incompatible definitions in different translation units
// CHECK: class1.cpp:19:3: note: enumerator 'b' with value 1 here
// CHECK: class2.cpp:12:3: note: enumerator 'a' with value 0 here