mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[clang][Interp] Fix visiting non-FieldDecl MemberExprs
Ignore the base and visit the Member decl like a regular DeclRefExpr.
This commit is contained in:
@@ -1494,6 +1494,9 @@ bool ByteCodeExprGen<Emitter>::VisitMemberExpr(const MemberExpr *E) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isa<FieldDecl>(Member))
|
||||
return this->discard(Base) && this->visitDeclRef(Member, E);
|
||||
|
||||
if (Initializing) {
|
||||
if (!this->delegate(Base))
|
||||
return false;
|
||||
@@ -1503,19 +1506,16 @@ bool ByteCodeExprGen<Emitter>::VisitMemberExpr(const MemberExpr *E) {
|
||||
}
|
||||
|
||||
// Base above gives us a pointer on the stack.
|
||||
if (const auto *FD = dyn_cast<FieldDecl>(Member)) {
|
||||
const RecordDecl *RD = FD->getParent();
|
||||
const Record *R = getRecord(RD);
|
||||
if (!R)
|
||||
return false;
|
||||
const Record::Field *F = R->getField(FD);
|
||||
// Leave a pointer to the field on the stack.
|
||||
if (F->Decl->getType()->isReferenceType())
|
||||
return this->emitGetFieldPop(PT_Ptr, F->Offset, E) && maybeLoadValue();
|
||||
return this->emitGetPtrFieldPop(F->Offset, E) && maybeLoadValue();
|
||||
}
|
||||
|
||||
return false;
|
||||
const auto *FD = cast<FieldDecl>(Member);
|
||||
const RecordDecl *RD = FD->getParent();
|
||||
const Record *R = getRecord(RD);
|
||||
if (!R)
|
||||
return false;
|
||||
const Record::Field *F = R->getField(FD);
|
||||
// Leave a pointer to the field on the stack.
|
||||
if (F->Decl->getType()->isReferenceType())
|
||||
return this->emitGetFieldPop(PT_Ptr, F->Offset, E) && maybeLoadValue();
|
||||
return this->emitGetPtrFieldPop(F->Offset, E) && maybeLoadValue();
|
||||
}
|
||||
|
||||
template <class Emitter>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -fsyntax-only -verify
|
||||
// RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -fsyntax-only -verify -fexperimental-new-constant-interpreter
|
||||
|
||||
struct S {
|
||||
enum { E = 1 };
|
||||
|
||||
Reference in New Issue
Block a user