forked from OSchip/llvm-project
Make sure to call PerformObjectMemberConversion where necessary.
llvm-svn: 90555
This commit is contained in:
parent
2474a7e9c2
commit
78cde14444
|
@ -605,6 +605,7 @@ Sema::BuildAnonymousStructUnionMemberReference(SourceLocation Loc,
|
|||
MemberType = Context.getQualifiedType(MemberType, NewQuals);
|
||||
|
||||
MarkDeclarationReferenced(Loc, *FI);
|
||||
PerformObjectMemberConversion(Result, *FI);
|
||||
// FIXME: Might this end up being a qualified name?
|
||||
Result = new (Context) MemberExpr(Result, BaseObjectIsPointer, *FI,
|
||||
OpLoc, MemberType);
|
||||
|
@ -2397,7 +2398,8 @@ Sema::BuildMemberReferenceExpr(ExprArg Base, QualType BaseExprType,
|
|||
if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) {
|
||||
// We may have found a field within an anonymous union or struct
|
||||
// (C++ [class.union]).
|
||||
if (cast<RecordDecl>(FD->getDeclContext())->isAnonymousStructOrUnion())
|
||||
if (cast<RecordDecl>(FD->getDeclContext())->isAnonymousStructOrUnion() &&
|
||||
!BaseType->getAs<RecordType>()->getDecl()->isAnonymousStructOrUnion())
|
||||
return BuildAnonymousStructUnionMemberReference(MemberLoc, FD,
|
||||
BaseExpr, OpLoc);
|
||||
|
||||
|
@ -6397,6 +6399,7 @@ Sema::OwningExprResult Sema::ActOnBuiltinOffsetOf(Scope *S,
|
|||
Res = BuildAnonymousStructUnionMemberReference(
|
||||
OC.LocEnd, MemberDecl, Res, OC.LocEnd).takeAs<Expr>();
|
||||
} else {
|
||||
PerformObjectMemberConversion(Res, MemberDecl);
|
||||
// MemberDecl->getType() doesn't get the right qualifiers, but it
|
||||
// doesn't matter here.
|
||||
Res = new (Context) MemberExpr(Res, false, MemberDecl, OC.LocEnd,
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
// RUN: clang-cc %s -fsyntax-only -verify
|
||||
// PR5543
|
||||
|
||||
struct A { int x; union { int* y; float& z; }; }; struct B : A {int a;};
|
||||
int* a(B* x) { return x->y; }
|
||||
|
||||
struct x { union { int y; }; }; x y; template <int X> int f() { return X+y.y; }
|
||||
int g() { return f<2>(); }
|
||||
|
|
@ -13,3 +13,6 @@ void f() {
|
|||
int i = __builtin_offsetof(P, fieldThatPointsToANonPODType.m); // expected-warning{{offset of on non-POD type 'struct P'}}
|
||||
}
|
||||
|
||||
struct Base { int x; };
|
||||
struct Derived : Base { int y; };
|
||||
int o = __builtin_offsetof(Derived, x); // expected-warning{{offset of on non-POD type}}
|
||||
|
|
Loading…
Reference in New Issue