@@ -1443,15 +1443,17 @@ Type Typechecker::typecheckMemberExpr(MemberExpr& expr) {
14431443 baseType = baseType.removePointer ();
14441444
14451445 if (baseType.isArrayType ()) {
1446- auto sizeSynonyms = {" count" , " length" , " size" };
1447-
1448- if (llvm::is_contained (sizeSynonyms, expr.getMemberName ())) {
1446+ if (llvm::is_contained ({" count" , " length" , " size" }, expr.getMemberName ())) {
14491447 ERROR (expr.getLocation (), " use the '.size()' member function to get the number of elements in an array" );
14501448 }
1451- }
1452-
1453- if (auto * typeDecl = baseType.getDecl ()) { // TODO: add comment why types don't always have decl
1454- for (auto & field : typeDecl->fields ) {
1449+ } else if (baseType.isTupleType ()) {
1450+ for (auto & element : baseType.getTupleElements ()) {
1451+ if (element.name == expr.getMemberName ()) {
1452+ return element.type ;
1453+ }
1454+ }
1455+ } else {
1456+ for (auto & field : baseType.getDecl ()->fields ) {
14551457 if (field.getName () == expr.getMemberName ()) {
14561458 checkHasAccess (field, expr.getLocation (), AccessLevel::None);
14571459 expr.setDecl (field);
@@ -1460,14 +1462,6 @@ Type Typechecker::typecheckMemberExpr(MemberExpr& expr) {
14601462 }
14611463 }
14621464
1463- if (baseType.isTupleType ()) {
1464- for (auto & element : baseType.getTupleElements ()) {
1465- if (element.name == expr.getMemberName ()) {
1466- return element.type ;
1467- }
1468- }
1469- }
1470-
14711465 ERROR (expr.getLocation (), " no member named '" << expr.getMemberName () << " ' in '" << baseType << " '" );
14721466}
14731467
0 commit comments