summaryrefslogtreecommitdiffstats
path: root/clang/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-02-06 22:48:16 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-02-06 22:48:16 +0000
commit1242fff6eced2fff31bf60a4357d0165c0da32b7 (patch)
tree2a3319e065548200a10788554313bf57aa94b6ea /clang/Sema/SemaExpr.cpp
parent2d489b5081a90b8c3c3808afb23cc3532048908a (diff)
downloadbcm5719-llvm-1242fff6eced2fff31bf60a4357d0165c0da32b7.tar.gz
bcm5719-llvm-1242fff6eced2fff31bf60a4357d0165c0da32b7.zip
Make sure to propagate qualifiers through the member operator.
llvm-svn: 46830
Diffstat (limited to 'clang/Sema/SemaExpr.cpp')
-rw-r--r--clang/Sema/SemaExpr.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/clang/Sema/SemaExpr.cpp b/clang/Sema/SemaExpr.cpp
index 4c8a1d953fe..f2bcc12ccf9 100644
--- a/clang/Sema/SemaExpr.cpp
+++ b/clang/Sema/SemaExpr.cpp
@@ -532,7 +532,15 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
if (!MemberDecl)
return Diag(OpLoc, diag::err_typecheck_no_member, Member.getName(),
SourceRange(MemberLoc));
- return new MemberExpr(BaseExpr, OpKind==tok::arrow, MemberDecl, MemberLoc);
+
+ // Figure out the type of the member; see C99 6.5.2.3p3
+ QualType MemberType = MemberDecl->getType();
+ unsigned combinedQualifiers =
+ MemberType.getQualifiers() | BaseType.getQualifiers();
+ MemberType = MemberType.getQualifiedType(combinedQualifiers);
+
+ return new MemberExpr(BaseExpr, OpKind==tok::arrow, MemberDecl,
+ MemberLoc, MemberType);
} else if (BaseType->isOCUVectorType() && OpKind == tok::period) {
// Component access limited to variables (reject vec4.rg.g).
if (!isa<DeclRefExpr>(BaseExpr))
@@ -2050,8 +2058,9 @@ Sema::ExprResult Sema::ActOnBuiltinOffsetOf(SourceLocation BuiltinLoc,
// FIXME: C++: Verify that MemberDecl isn't a static field.
// FIXME: Verify that MemberDecl isn't a bitfield.
-
- Res = new MemberExpr(Res, false, MemberDecl, OC.LocEnd);
+ // MemberDecl->getType() doesn't get the right qualifiers, but it doesn't
+ // matter here.
+ Res = new MemberExpr(Res, false, MemberDecl, OC.LocEnd, MemberDecl->getType());
}
return new UnaryOperator(Res, UnaryOperator::OffsetOf, Context.getSizeType(),
OpenPOWER on IntegriCloud