             }
         }
         if expressions["left"] == nil, expressions["right"] != nil {
+            _getters["left"] = nil
             expressions["left"] = "right - width"
         }
         if expressions["height"] == nil {
+            _getters["height"] = nil
             if _class is UIStackView.Type {
                 expressions["height"] = "auto" // TODO: remove special case
             } else if expressions["top"] != nil, expressions["bottom"] != nil {

    // MARK: expressions

    private func overrideExpressions() {
        assert(_setupComplete && _view != nil)
        expressions = _originalExpressions

        // layout props
        if expressions["width"] == nil {
            if expressions["left"] != nil, expressions["right"] != nil {
                expressions["width"] = "right - left"
            } else if !(_view is UIScrollView),

    // Used by LayoutExpression and for unit tests
    // Note: thrown error is always a SymbolError
    func value(forSymbol symbol: String) throws -> Any {
        try setUpExpression(for: symbol)
        if let getter = _getters[symbol] {
            return try getter()
        }
        assert(expressions[symbol] == nil)
        let getter: () throws -> Any
        switch symbol {
        case "left":
