| 
									
										
										
										
											2008-09-10 14:21:42 -07:00
										 |  |  | // $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: fails incorrectly | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Copyright 2009 The Go Authors. All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:40:40 -08:00
										 |  |  | type S struct { | 
					
						
							| 
									
										
										
										
											2008-09-10 14:21:42 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (p *S) M() { | 
					
						
							|  |  |  | 	print("M\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 14:40:40 -08:00
										 |  |  | type I interface { | 
					
						
							| 
									
										
										
										
											2008-09-10 14:21:42 -07:00
										 |  |  | 	M(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	var p *S = nil; | 
					
						
							|  |  |  | 	var i I = p;  // this should be possible even though p is nil: we still know the type | 
					
						
							|  |  |  | 	i.M();  // should be possible since we know the type, and don't ever use the receiver | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | throw: ifaces2i: nil pointer | 
					
						
							|  |  |  | SIGSEGV: segmentation violation | 
					
						
							|  |  |  | Faulting address: 0x0 | 
					
						
							|  |  |  | pc: 0x1b7d | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 0x1b7d?zi | 
					
						
							|  |  |  | 	throw(30409, 0, 0, ...) | 
					
						
							|  |  |  | 	throw(0x76c9, 0x0, 0x0, ...) | 
					
						
							|  |  |  | 0x207f?zi | 
					
						
							|  |  |  | 	sys·ifaces2i(31440, 0, 31480, ...) | 
					
						
							|  |  |  | 	sys·ifaces2i(0x7ad0, 0x7af8, 0x0, ...) | 
					
						
							|  |  |  | 0x136f?zi | 
					
						
							|  |  |  | 	main·main(1, 0, 1606416424, ...) | 
					
						
							|  |  |  | 	main·main(0x1, 0x7fff5fbff828, 0x0, ...) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rax     0x1 | 
					
						
							|  |  |  | rbx     0x1 | 
					
						
							|  |  |  | rcx     0x33b5 | 
					
						
							|  |  |  | rdx     0x0 | 
					
						
							|  |  |  | rdi     0x1 | 
					
						
							|  |  |  | rsi     0x7684 | 
					
						
							|  |  |  | rbp     0x7684 | 
					
						
							|  |  |  | rsp     0xafb8 | 
					
						
							|  |  |  | r8      0x0 | 
					
						
							|  |  |  | r9      0x0 | 
					
						
							|  |  |  | r10     0x1002 | 
					
						
							|  |  |  | r11     0x206 | 
					
						
							|  |  |  | r12     0x0 | 
					
						
							|  |  |  | r13     0x0 | 
					
						
							|  |  |  | r14     0x7c48 | 
					
						
							|  |  |  | r15     0xa000 | 
					
						
							|  |  |  | rip     0x1b7d | 
					
						
							|  |  |  | rflags  0x10202 | 
					
						
							|  |  |  | cs      0x27 | 
					
						
							|  |  |  | fs      0x10 | 
					
						
							|  |  |  | gs      0x48 | 
					
						
							|  |  |  | */ |