local compat52 = table.pack
local mt = { __len = function(o, o2)
  if compat52 then
    assert(o2 == o)
  else
    assert(o2 == nil)
  end
  return 42
end }

do --- table
  local t = {1,2,3}
  assert(#t == 3)
  assert(#"abcdef" == 6)

  setmetatable(t, { __foo = function() end })
  assert(#t == 3)
  assert(#t == 3)

  setmetatable(t, mt)
  if compat52 then
    assert(#t == 42) -- __len DOES work on tables.
    assert(rawlen(t) == 3)
  else
    assert(#t == 3) -- __len does NOT work on tables.
  end
end

do --- userdata +lua<5.2
  local u = newproxy(true)
  getmetatable(u).__len = function(o) return 42 end
  assert(#u == 42)
  local x = 0
  for i=1,100 do x = x + #u end
  assert(x == 4200)
end

do --- number
  debug.setmetatable(0, mt)
  assert(#1 == 42)
  debug.setmetatable(0, nil)
end