Differences between typecheck and untypecheck

Checking the api doc - http://www.scala-lang.org/api/2.11.1/scala-reflect/index.html#scala.reflect.macros.whitebox.Context, it seems to me the differences come from typecheck would give or be with some attributed. When running the following code for the function { () => val sum = 1 + 1; println(s"sum: $sum") }

val untypedTree = c.untypecheck(f)
log.info(s"untyped tree: $untypedTree")

val typedTree = c.typecheck(f)
log.info(s"typed tree: $typedTree")

It prints below information to console.

untyped tree: (() => {
val sum = 2;
scala.Predef.println(scala.StringContext.apply("sum: ", “”).s(sum))

typed tree: (() => {
val sum: Int = 2;
scala.Predef.println(scala.StringContext.apply("sum: ", “”).s(sum))
})

Does that mean the difference between typecheck and untype check is typecheck would contain more information, such as variable type, and so on, about the tree being checked?

The doc at http://docs.scala-lang.org/overviews/macros/changelog211.html looks like more advance than what I can understand.

Is there any more detail but simpler document talking about this?

Thanks