Apply array-to-pointer decay when instantiating a MemberExpr. Fixes

PR7405, patch by Kyle Lippincott!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106523 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-06-22 02:41:05 +00:00
Родитель cd9fb98c99
Коммит 83c9abcce2
2 изменённых файлов: 30 добавлений и 3 удалений

Просмотреть файл

@ -1174,7 +1174,9 @@ public:
SS.setScopeRep(Qualifier);
}
QualType BaseType = ((Expr*) Base.get())->getType();
Expr *BaseExpr = Base.takeAs<Expr>();
getSema().DefaultFunctionArrayConversion(BaseExpr);
QualType BaseType = BaseExpr->getType();
// FIXME: this involves duplicating earlier analysis in a lot of
// cases; we should avoid this when possible.
@ -1183,8 +1185,8 @@ public:
R.addDecl(FoundDecl);
R.resolveKind();
return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
OpLoc, isArrow,
return getSema().BuildMemberReferenceExpr(getSema().Owned(BaseExpr),
BaseType, OpLoc, isArrow,
SS, FirstQualifierInScope,
R, ExplicitTemplateArgs);
}

Просмотреть файл

@ -0,0 +1,25 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
struct mystruct {
int member;
};
template <int i>
int foo() {
mystruct s[1];
return s->member;
}
int main() {
foo<1>();
}
// PR7405
struct hb_sanitize_context_t {
int start;
};
template <typename Type> static bool sanitize() {
hb_sanitize_context_t c[1];
return !c->start;
}
bool closure = sanitize<int>();