/// ParseDesignator - Parse a designator. Return null if current token is not a /// designator. /// /// [R601]: /// designator := /// object-name /// or array-element /// or array-section /// or coindexed-named-object /// or complex-part-designator /// or structure-component /// or substring /// /// FIXME: substring for a character array ExprResult Parser::ParseDesignator(bool IsLvalue) { auto E = ParseNameOrCall(); struct ScopedFlag { bool value; bool &dest; ScopedFlag(bool &flag) : dest(flag) { value = flag; } ~ScopedFlag() { dest = value; } }; ScopedFlag Flag(DontResolveIdentifiers); if(DontResolveIdentifiersInSubExpressions) DontResolveIdentifiers = true; while(true) { if(!E.isUsable()) break; if(IsPresent(tok::l_paren)) { auto EType = E.get()->getType(); if(EType->isArrayType()) E = ParseArraySubscript(E); else if(EType->isCharacterType()) E = ParseSubstring(E); else { Diag.Report(Tok.getLocation(), diag::err_unexpected_lparen); return ExprError(); } } else if(IsPresent(tok::percent)) { auto EType = E.get()->getType(); if(EType->isRecordType()) E = ParseStructureComponent(E); else { Diag.Report(Tok.getLocation(), diag::err_unexpected_percent); return ExprError(); } } else if(IsPresent(tok::period)) { auto EType = E.get()->getType(); if(EType->isRecordType()) E = ParseStructureComponent(E); else { Diag.Report(Tok.getLocation(), diag::err_unexpected_period); return ExprError(); } } else break; } return E; }
bool MdsEditView::isRecord(QListViewItem *item) const { QListViewItem *parent = item->parent(); if (!parent) return false; return isRecordType(parent); }
void MdsEditView::slotSelectionChanged(QListViewItem *item) { QString path = buildRecordPath(item); statusBar()->message(path); refreshListView(); newRecordAction->setEnabled(isRecordType(item)); }
RValueTy CodeGenFunction::EmitRValue(const Expr *E) { auto EType = E->getType(); if(EType->isComplexType()) return EmitComplexExpr(E); else if(EType->isCharacterType()) return EmitCharacterExpr(E); else if(EType->isLogicalType()) return EmitLogicalValueExpr(E); else if(EType->isRecordType()) return EmitAggregateExpr(E); else return EmitScalarExpr(E); }
std::string visitType(const Type &type) const { std::string str; if(isNumberType(type)) { str="i:"+type.getName(); } else if(isSymbolType(type)) { str="s:"+type.getName(); } else if(isRecordType(type)) { str="r:"+type.getName(); } else { ASSERT(false && "unknown type class"); } seen[&type] = str; return str; }