Un-special-case parsing base."etc"
diff --git a/internal/cgen/expr.go b/internal/cgen/expr.go
index 7aa94e2..fa5ad27 100644
--- a/internal/cgen/expr.go
+++ b/internal/cgen/expr.go
@@ -38,6 +38,8 @@
 			b.writes("NULL")
 		} else if typ.IsStatus() {
 			b.writes("wuffs_base__make_status(NULL)")
+		} else if !typ.IsBool() {
+			return fmt.Errorf("cannot generate C expression for %v constant of type %q", n.Str(g.tm), n.MType().Str(g.tm))
 		} else if cv.Cmp(zero) == 0 {
 			b.writes("false")
 		} else if cv.Cmp(one) == 0 {
@@ -79,9 +81,9 @@
 				b.writes("wuffs_base__make_status(")
 				b.writes(z.cName)
 				b.writes(")")
-			} else {
-				return fmt.Errorf("unrecognized status %s", n.StatusQID().Str(g.tm))
+				return nil
 			}
+			return fmt.Errorf("unrecognized status %s", n.StatusQID().Str(g.tm))
 
 		} else if c, ok := g.scalarConstsMap[t.QID{0, n.Ident()}]; ok {
 			b.writes(c.Value().ConstValue().String())
@@ -212,6 +214,14 @@
 			b.writes(aPrefix)
 			b.writes(n.Ident().Str(g.tm))
 			return nil
+		} else if (lhs.Operator() == 0) && n.Ident().IsDQStrLiteral(g.tm) {
+			if z := g.statusMap[t.QID{lhs.Ident(), n.Ident()}]; z.cName != "" {
+				b.writes("wuffs_base__make_status(")
+				b.writes(z.cName)
+				b.writes(")")
+				return nil
+			}
+			return fmt.Errorf("unrecognized status %s", n.Str(g.tm))
 		}
 
 		if err := g.writeExpr(b, lhs, depth); err != nil {
@@ -317,10 +327,16 @@
 
 func (g *gen) writeExprRepr(b *buffer, n *a.Expr, depth uint32) error {
 	isStatus := n.MType().IsStatus()
-	if isStatus && (n.Operator() == 0) && n.Ident().IsDQStrLiteral(g.tm) {
-		if z := g.statusMap[n.StatusQID()]; z.cName != "" {
-			b.writes(z.cName)
-			return nil
+	if isStatus {
+		if op := n.Operator(); ((op == 0) || (op == t.IDDot)) && n.Ident().IsDQStrLiteral(g.tm) {
+			qid := t.QID{0, n.Ident()}
+			if op == t.IDDot {
+				qid[0] = n.LHS().AsExpr().Ident()
+			}
+			if z := g.statusMap[qid]; z.cName != "" {
+				b.writes(z.cName)
+				return nil
+			}
 		}
 	}
 	if err := g.writeExpr(b, n, depth); err != nil {
diff --git a/internal/cgen/statement.go b/internal/cgen/statement.go
index fb6cd50..c0c1b8a 100644
--- a/internal/cgen/statement.go
+++ b/internal/cgen/statement.go
@@ -487,12 +487,10 @@
 		couldBeSuspension := false
 		if retExpr.MType().IsStatus() && !n.RetsError() {
 			couldBeSuspension = true
-			if retExpr.Operator() == 0 {
-				if id := retExpr.Ident(); id == t.IDOk {
-					couldBeSuspension = false
-				} else if s := g.tm.ByID(id); (len(s) > 1) && (s[0] == '"') {
-					couldBeSuspension = s[1] == '$'
-				}
+			if s := g.tm.ByID(retExpr.Ident()); (len(s) > 1) && (s[0] == '"') {
+				couldBeSuspension = s[1] == '$'
+			} else if (retExpr.Operator() == 0) && (retExpr.Ident() == t.IDOk) {
+				couldBeSuspension = false
 			}
 		}
 
diff --git a/lang/check/bounds.go b/lang/check/bounds.go
index d2bdc9f..0ce1f32 100644
--- a/lang/check/bounds.go
+++ b/lang/check/bounds.go
@@ -317,7 +317,7 @@
 		}
 
 		if lTyp.IsStatus() {
-			if v := n.Value(); v.Operator() == 0 {
+			if v := n.Value(); (v.Operator() == 0) || (v.Operator() == t.IDDot) {
 				if id := v.Ident(); (id != t.IDOk) && (q.hasIsErrorFact(id) || isErrorStatus(id, q.tm)) {
 					n.SetRetsError()
 				}
diff --git a/lang/check/type.go b/lang/check/type.go
index 7f53b06..ac99f25 100644
--- a/lang/check/type.go
+++ b/lang/check/type.go
@@ -502,9 +502,12 @@
 		n.SetMType(c.XType())
 		return nil
 	}
-	// TODO: look for other (global) names: consts, funcs, statuses,
-	// structs from used packages.
-	return fmt.Errorf("check: unrecognized identifier %q", qid.Str(q.tm))
+	if _, ok := q.c.statuses[t.QID{x, y}]; ok {
+		n.SetMType(typeExprStatus)
+		return nil
+	}
+	// TODO: look in q.c.structs.
+	return fmt.Errorf("check: unrecognized name %q", qid.Str(q.tm))
 }
 
 func (q *checker) tcheckExprCall(n *a.Expr, depth uint32) error {
diff --git a/lang/parse/parse.go b/lang/parse/parse.go
index 5dc7a43..52a9b23 100644
--- a/lang/parse/parse.go
+++ b/lang/parse/parse.go
@@ -1355,22 +1355,14 @@
 
 		case t.IDDot:
 			p.src = p.src[1:]
-
-			if x := p.peek1(); x.IsLiteral(p.tm) {
-				if !x.IsDQStrLiteral(p.tm) {
-					return nil, fmt.Errorf(`parse: dot followed by non-"-string literal at %s:%d`, p.filename, p.line())
-				}
-				if !first {
-					return nil, fmt.Errorf(`parse: "-string literal %s has too many package qualifiers at %s:%d`,
-						x.Str(p.tm), p.filename, p.line())
-				}
+			selector := p.peek1()
+			if first && selector.IsDQStrLiteral(p.tm) {
 				p.src = p.src[1:]
-				return a.NewExpr(0, 0, id, x, nil, nil, nil, nil), nil
-			}
-
-			selector, err := p.parseIdent()
-			if err != nil {
-				return nil, err
+			} else {
+				selector, err = p.parseIdent()
+				if err != nil {
+					return nil, err
+				}
 			}
 			lhs = a.NewExpr(0, t.IDDot, 0, selector, lhs.AsNode(), nil, nil, nil)
 		}