﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	difficulty
1476	(scrutinizer) Should global types be smashed in local contexts?	megane		"Currently types for globals are not smashed. Should they be smashed in, say functions?

Similar to #1475.

{{{
(define-type type (vector (or fixnum symbol)))
(: g type)
(define g (vector (the * 1)))

;; define pure alias, so printing doesn't smash
(: p (* --> undefined))
(define p print)

(define (foo)
  (compiler-typecase g (type (p ""global ok"")))
  (vector-set! g 0 'foo)
  (compiler-typecase g (type (p ""global not smashed"")))

  (let ([l g])
    (compiler-typecase l (type (p ""alias ok"")))
    (compiler-typecase l (type (p ""alias ok after printing"")))
    (vector-set! g 0 'foo)
    (compiler-typecase g (type (p ""global not smashed"")))
    (compiler-typecase l
      (type 'oop)
      ((vector *) (p ""alias smashed""))))

  (compiler-typecase g
    (type (p ""global not smashed""))
    ((vector *) (p ""global smashed""))))
(foo)

;; $ csc -O3 global-smashing.scm && ./global-smashing 
;; global ok
;; global not smashed
;; alias ok
;; alias ok after printing
;; global not smashed
;; alias smashed
;; global not smashed

}}}"	task	new	minor	someday	scrutinizer	5.0.0		smashing		
