From 783dd6ece4d1cacbbe9c5790c5a0b6cf9a4b7c9c Mon Sep 17 00:00:00 2001 From: Francois Pichet Date: Sun, 21 Nov 2010 06:08:52 +0000 Subject: Major anonymous union/struct redesign. A new AST node is introduced: def IndirectField : DDecl; IndirectFields are injected into the anonymous's parent scope and chain back to the original field. Name lookup for anonymous entities now result in an IndirectFieldDecl instead of a FieldDecl. There is no functionality change, the code generated should be the same. llvm-svn: 119919 --- clang/lib/Sema/SemaDeclCXX.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'clang/lib/Sema/SemaDeclCXX.cpp') diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 2741c6de657..235b41e342e 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1067,10 +1067,15 @@ Sema::ActOnMemInitializer(Decl *ConstructorD, FieldDecl *Member = 0; DeclContext::lookup_result Result = ClassDecl->lookup(MemberOrBase); - if (Result.first != Result.second) + if (Result.first != Result.second) { Member = dyn_cast(*Result.first); - - // FIXME: Handle members of an anonymous union. + + // Handle anonymous union case. + if (!Member) + if (IndirectFieldDecl* IndirectField + = dyn_cast(*Result.first)) + Member = IndirectField->getAnonField(); + } if (Member) return BuildMemberInitializer(Member, (Expr**)Args, NumArgs, IdLoc, @@ -2600,15 +2605,15 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { // In addition, if class T has a user-declared constructor (12.1), every // non-static data member of class T shall have a name different from T. for (DeclContext::lookup_result R = Record->lookup(Record->getDeclName()); - R.first != R.second; ++R.first) - if (FieldDecl *Field = dyn_cast(*R.first)) { - if (Record->hasUserDeclaredConstructor() || - !Field->getDeclContext()->Equals(Record)) { - Diag(Field->getLocation(), diag::err_member_name_of_class) - << Field->getDeclName(); + R.first != R.second; ++R.first) { + NamedDecl *D = *R.first; + if ((isa(D) && Record->hasUserDeclaredConstructor()) || + isa(D)) { + Diag(D->getLocation(), diag::err_member_name_of_class) + << D->getDeclName(); break; } - } + } } } -- cgit v1.2.3