Revert "parser: make duplicated functions an error (#8792)"
This reverts commit 21bf8fe14e.
			
			
				pull/8814/head
			
			
		
							parent
							
								
									21bf8fe14e
								
							
						
					
					
						commit
						bf6e9ff95a
					
				|  | @ -346,39 +346,54 @@ fn C.ReleaseSRWLockShared(voidptr) | ||||||
| fn C.ReleaseSRWLockExclusive(voidptr) | fn C.ReleaseSRWLockExclusive(voidptr) | ||||||
| 
 | 
 | ||||||
| // pthread.h
 | // pthread.h
 | ||||||
| [trusted] |  | ||||||
| fn C.pthread_mutex_init(voidptr, voidptr) int | fn C.pthread_mutex_init(voidptr, voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_mutex_lock(voidptr) int | fn C.pthread_mutex_lock(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_mutex_unlock(voidptr) int | fn C.pthread_mutex_unlock(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_mutex_destroy(voidptr) int | fn C.pthread_mutex_destroy(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlockattr_init(voidptr) int | fn C.pthread_rwlockattr_init(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlockattr_setkind_np(voidptr, int) int | fn C.pthread_rwlockattr_setkind_np(voidptr, int) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlockattr_setpshared(voidptr, int) int | fn C.pthread_rwlockattr_setpshared(voidptr, int) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlock_init(voidptr, voidptr) int | fn C.pthread_rwlock_init(voidptr, voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlock_rdlock(voidptr) int | fn C.pthread_rwlock_rdlock(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlock_wrlock(voidptr) int | fn C.pthread_rwlock_wrlock(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_rwlock_unlock(voidptr) int | fn C.pthread_rwlock_unlock(voidptr) int | ||||||
| 
 | 
 | ||||||
| fn C.pthread_condattr_init(voidptr) int | fn C.pthread_condattr_init(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_condattr_setpshared(voidptr, int) int | fn C.pthread_condattr_setpshared(voidptr, int) int | ||||||
|  | 
 | ||||||
| fn C.pthread_condattr_destroy(voidptr) int | fn C.pthread_condattr_destroy(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_cond_init(voidptr, voidptr) int | fn C.pthread_cond_init(voidptr, voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_cond_signal(voidptr) int | fn C.pthread_cond_signal(voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_cond_wait(voidptr, voidptr) int | fn C.pthread_cond_wait(voidptr, voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_cond_timedwait(voidptr, voidptr, voidptr) int | fn C.pthread_cond_timedwait(voidptr, voidptr, voidptr) int | ||||||
|  | 
 | ||||||
| fn C.pthread_cond_destroy(voidptr) int | fn C.pthread_cond_destroy(voidptr) int | ||||||
| 
 | 
 | ||||||
| [trusted] |  | ||||||
| fn C.sem_init(voidptr, int, u32) int | fn C.sem_init(voidptr, int, u32) int | ||||||
| [trusted] | 
 | ||||||
| fn C.sem_post(voidptr) int | fn C.sem_post(voidptr) int | ||||||
| [trusted] | 
 | ||||||
| fn C.sem_wait(voidptr) int | fn C.sem_wait(voidptr) int | ||||||
| [trusted] | 
 | ||||||
| fn C.sem_trywait(voidptr) int | fn C.sem_trywait(voidptr) int | ||||||
| [trusted] | 
 | ||||||
| fn C.sem_timedwait(voidptr, voidptr) int | fn C.sem_timedwait(voidptr, voidptr) int | ||||||
| [trusted] | 
 | ||||||
| fn C.sem_destroy(voidptr) int | fn C.sem_destroy(voidptr) int | ||||||
| 
 | 
 | ||||||
| // MacOS semaphore functions
 | // MacOS semaphore functions
 | ||||||
|  |  | ||||||
|  | @ -43,3 +43,60 @@ mut: | ||||||
| 
 | 
 | ||||||
| struct C.sockaddr_storage { | struct C.sockaddr_storage { | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn C.socket() int | ||||||
|  | 
 | ||||||
|  | fn C.setsockopt() int | ||||||
|  | 
 | ||||||
|  | fn C.htonl() int | ||||||
|  | 
 | ||||||
|  | fn C.htons() int | ||||||
|  | 
 | ||||||
|  | fn C.bind() int | ||||||
|  | 
 | ||||||
|  | fn C.listen() int | ||||||
|  | 
 | ||||||
|  | fn C.accept() int | ||||||
|  | 
 | ||||||
|  | fn C.getaddrinfo() int | ||||||
|  | 
 | ||||||
|  | fn C.connect() int | ||||||
|  | 
 | ||||||
|  | fn C.send() int | ||||||
|  | 
 | ||||||
|  | fn C.sendto() int | ||||||
|  | 
 | ||||||
|  | fn C.recv() int | ||||||
|  | 
 | ||||||
|  | fn C.recvfrom() int | ||||||
|  | 
 | ||||||
|  | fn C.shutdown() int | ||||||
|  | 
 | ||||||
|  | fn C.ntohs() int | ||||||
|  | 
 | ||||||
|  | fn C.getpeername() int | ||||||
|  | 
 | ||||||
|  | fn C.inet_ntop(af int, src voidptr, dst charptr, dst_size int) charptr | ||||||
|  | 
 | ||||||
|  | fn C.WSAAddressToStringA() int | ||||||
|  | 
 | ||||||
|  | fn C.getsockname() int | ||||||
|  | 
 | ||||||
|  | // defined in builtin
 | ||||||
|  | // fn C.read() int
 | ||||||
|  | // fn C.close() int
 | ||||||
|  | 
 | ||||||
|  | fn C.ioctlsocket() int | ||||||
|  | 
 | ||||||
|  | fn C.fcntl() int | ||||||
|  | 
 | ||||||
|  | fn C.@select() int | ||||||
|  | 
 | ||||||
|  | fn C.FD_ZERO() | ||||||
|  | 
 | ||||||
|  | fn C.FD_SET() | ||||||
|  | 
 | ||||||
|  | fn C.FD_ISSET() bool | ||||||
|  | 
 | ||||||
|  | [typedef] | ||||||
|  | struct C.fd_set {} | ||||||
|  |  | ||||||
|  | @ -24,9 +24,7 @@ fn C.atomic_store_ptr(voidptr, voidptr) | ||||||
| fn C.atomic_compare_exchange_weak_ptr(voidptr, voidptr, voidptr) bool | fn C.atomic_compare_exchange_weak_ptr(voidptr, voidptr, voidptr) bool | ||||||
| fn C.atomic_compare_exchange_strong_ptr(voidptr, voidptr, voidptr) bool | fn C.atomic_compare_exchange_strong_ptr(voidptr, voidptr, voidptr) bool | ||||||
| fn C.atomic_exchange_ptr(voidptr, voidptr) voidptr | fn C.atomic_exchange_ptr(voidptr, voidptr) voidptr | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_add_ptr(voidptr, voidptr) voidptr | fn C.atomic_fetch_add_ptr(voidptr, voidptr) voidptr | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_sub_ptr(voidptr, voidptr) voidptr | fn C.atomic_fetch_sub_ptr(voidptr, voidptr) voidptr | ||||||
| 
 | 
 | ||||||
| fn C.atomic_load_u16(voidptr) u16 | fn C.atomic_load_u16(voidptr) u16 | ||||||
|  | @ -34,9 +32,7 @@ fn C.atomic_store_u16(voidptr, u16) | ||||||
| fn C.atomic_compare_exchange_weak_u16(voidptr, voidptr, u16) bool | fn C.atomic_compare_exchange_weak_u16(voidptr, voidptr, u16) bool | ||||||
| fn C.atomic_compare_exchange_strong_u16(voidptr, voidptr, u16) bool | fn C.atomic_compare_exchange_strong_u16(voidptr, voidptr, u16) bool | ||||||
| fn C.atomic_exchange_u16(voidptr, u16) u16 | fn C.atomic_exchange_u16(voidptr, u16) u16 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_add_u16(voidptr, u16) u16 | fn C.atomic_fetch_add_u16(voidptr, u16) u16 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_sub_u16(voidptr, u16) u16 | fn C.atomic_fetch_sub_u16(voidptr, u16) u16 | ||||||
| 
 | 
 | ||||||
| fn C.atomic_load_u32(voidptr) u32 | fn C.atomic_load_u32(voidptr) u32 | ||||||
|  | @ -44,9 +40,7 @@ fn C.atomic_store_u32(voidptr, u32) | ||||||
| fn C.atomic_compare_exchange_weak_u32(voidptr, voidptr, u32) bool | fn C.atomic_compare_exchange_weak_u32(voidptr, voidptr, u32) bool | ||||||
| fn C.atomic_compare_exchange_strong_u32(voidptr, voidptr, u32) bool | fn C.atomic_compare_exchange_strong_u32(voidptr, voidptr, u32) bool | ||||||
| fn C.atomic_exchange_u32(voidptr, u32) u32 | fn C.atomic_exchange_u32(voidptr, u32) u32 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_add_u32(voidptr, u32) u32 | fn C.atomic_fetch_add_u32(voidptr, u32) u32 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_sub_u32(voidptr, u32) u32 | fn C.atomic_fetch_sub_u32(voidptr, u32) u32 | ||||||
| 
 | 
 | ||||||
| fn C.atomic_load_u64(voidptr) u64 | fn C.atomic_load_u64(voidptr) u64 | ||||||
|  | @ -54,9 +48,7 @@ fn C.atomic_store_u64(voidptr, u64) | ||||||
| fn C.atomic_compare_exchange_weak_u64(voidptr, voidptr, u64) bool | fn C.atomic_compare_exchange_weak_u64(voidptr, voidptr, u64) bool | ||||||
| fn C.atomic_compare_exchange_strong_u64(voidptr, voidptr, u64) bool | fn C.atomic_compare_exchange_strong_u64(voidptr, voidptr, u64) bool | ||||||
| fn C.atomic_exchange_u64(voidptr, u64) u64 | fn C.atomic_exchange_u64(voidptr, u64) u64 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_add_u64(voidptr, u64) u64 | fn C.atomic_fetch_add_u64(voidptr, u64) u64 | ||||||
| [trusted] |  | ||||||
| fn C.atomic_fetch_sub_u64(voidptr, u64) u64 | fn C.atomic_fetch_sub_u64(voidptr, u64) u64 | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
|  |  | ||||||
|  | @ -4,6 +4,9 @@ import sync | ||||||
| 
 | 
 | ||||||
| import runtime | import runtime | ||||||
| 
 | 
 | ||||||
|  | [trusted] | ||||||
|  | fn C.atomic_fetch_add_u32(voidptr, u32) u32 | ||||||
|  | 
 | ||||||
| pub const ( | pub const ( | ||||||
| 	no_result = voidptr(0) | 	no_result = voidptr(0) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -8,6 +8,25 @@ import time | ||||||
| #flag -lpthread | #flag -lpthread | ||||||
| #include <semaphore.h> | #include <semaphore.h> | ||||||
| 
 | 
 | ||||||
|  | [trusted] | ||||||
|  | fn C.pthread_mutex_init(voidptr, voidptr) int | ||||||
|  | fn C.pthread_mutex_lock(voidptr) int | ||||||
|  | fn C.pthread_mutex_unlock(voidptr) int | ||||||
|  | fn C.pthread_mutex_destroy(voidptr) int | ||||||
|  | fn C.pthread_rwlockattr_init(voidptr) int | ||||||
|  | fn C.pthread_rwlockattr_setkind_np(voidptr, int) int | ||||||
|  | fn C.pthread_rwlockattr_setpshared(voidptr, int) int | ||||||
|  | fn C.pthread_rwlock_init(voidptr, voidptr) int | ||||||
|  | fn C.pthread_rwlock_rdlock(voidptr) int | ||||||
|  | fn C.pthread_rwlock_wrlock(voidptr) int | ||||||
|  | fn C.pthread_rwlock_unlock(voidptr) int | ||||||
|  | fn C.sem_init(voidptr, int, u32) int | ||||||
|  | fn C.sem_post(voidptr) int | ||||||
|  | fn C.sem_wait(voidptr) int | ||||||
|  | fn C.sem_trywait(voidptr) int | ||||||
|  | fn C.sem_timedwait(voidptr, voidptr) int | ||||||
|  | fn C.sem_destroy(voidptr) int | ||||||
|  | 
 | ||||||
| // [init_with=new_mutex] // TODO: implement support for this struct attribute, and disallow Mutex{} from outside the sync.new_mutex() function.
 | // [init_with=new_mutex] // TODO: implement support for this struct attribute, and disallow Mutex{} from outside the sync.new_mutex() function.
 | ||||||
| [heap] | [heap] | ||||||
| pub struct Mutex { | pub struct Mutex { | ||||||
|  |  | ||||||
|  | @ -9,6 +9,27 @@ import time | ||||||
| #include <semaphore.h> | #include <semaphore.h> | ||||||
| #include <sys/errno.h> | #include <sys/errno.h> | ||||||
| 
 | 
 | ||||||
|  | [trusted] | ||||||
|  | fn C.pthread_mutex_init(voidptr, voidptr) int | ||||||
|  | fn C.pthread_mutex_lock(voidptr) int | ||||||
|  | fn C.pthread_mutex_unlock(voidptr) int | ||||||
|  | fn C.pthread_mutex_destroy(voidptr) int | ||||||
|  | fn C.pthread_rwlockattr_init(voidptr) int | ||||||
|  | fn C.pthread_rwlockattr_setkind_np(voidptr, int) int | ||||||
|  | fn C.pthread_rwlockattr_setpshared(voidptr, int) int | ||||||
|  | fn C.pthread_rwlock_init(voidptr, voidptr) int | ||||||
|  | fn C.pthread_rwlock_rdlock(voidptr) int | ||||||
|  | fn C.pthread_rwlock_wrlock(voidptr) int | ||||||
|  | fn C.pthread_rwlock_unlock(voidptr) int | ||||||
|  | fn C.pthread_condattr_init(voidptr) int | ||||||
|  | fn C.pthread_condattr_setpshared(voidptr, int) int | ||||||
|  | fn C.pthread_condattr_destroy(voidptr) int | ||||||
|  | fn C.pthread_cond_init(voidptr, voidptr) int | ||||||
|  | fn C.pthread_cond_signal(voidptr) int | ||||||
|  | fn C.pthread_cond_wait(voidptr, voidptr) int | ||||||
|  | fn C.pthread_cond_timedwait(voidptr, voidptr, voidptr) int | ||||||
|  | fn C.pthread_cond_destroy(voidptr) int | ||||||
|  | 
 | ||||||
| // [init_with=new_mutex] // TODO: implement support for this struct attribute, and disallow Mutex{} from outside the sync.new_mutex() function.
 | // [init_with=new_mutex] // TODO: implement support for this struct attribute, and disallow Mutex{} from outside the sync.new_mutex() function.
 | ||||||
| [heap] | [heap] | ||||||
| pub struct Mutex { | pub struct Mutex { | ||||||
|  |  | ||||||
|  | @ -3,6 +3,9 @@ | ||||||
| // that can be found in the LICENSE file.
 | // that can be found in the LICENSE file.
 | ||||||
| module sync | module sync | ||||||
| 
 | 
 | ||||||
|  | [trusted] | ||||||
|  | fn C.atomic_fetch_add_u32(voidptr, u32) u32 | ||||||
|  | 
 | ||||||
| // WaitGroup
 | // WaitGroup
 | ||||||
| // Do not copy an instance of WaitGroup, use a ref instead.
 | // Do not copy an instance of WaitGroup, use a ref instead.
 | ||||||
| //
 | //
 | ||||||
|  |  | ||||||
|  | @ -54,6 +54,31 @@ struct C.FOCUS_EVENT_RECORD { | ||||||
| 	bSetFocus int | 	bSetFocus int | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | [typedef] | ||||||
|  | struct C.COORD { | ||||||
|  | 	X i16 | ||||||
|  | 	Y i16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [typedef] | ||||||
|  | struct C.SMALL_RECT { | ||||||
|  | 	Left   u16 | ||||||
|  | 	Top    u16 | ||||||
|  | 	Right  u16 | ||||||
|  | 	Bottom u16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [typedef] | ||||||
|  | struct C.CONSOLE_SCREEN_BUFFER_INFO { | ||||||
|  | 	dwSize              C.COORD | ||||||
|  | 	dwCursorPosition    C.COORD | ||||||
|  | 	wAttributes         u16 | ||||||
|  | 	srWindow            C.SMALL_RECT | ||||||
|  | 	dwMaximumWindowSize C.COORD | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn C.ReadConsoleInput() bool | fn C.ReadConsoleInput() bool | ||||||
| 
 | 
 | ||||||
| fn C.GetNumberOfConsoleInputEvents() bool | fn C.GetNumberOfConsoleInputEvents() bool | ||||||
|  | 
 | ||||||
|  | fn C.GetConsoleScreenBufferInfo(handle os.HANDLE, info &C.CONSOLE_SCREEN_BUFFER_INFO) bool | ||||||
|  |  | ||||||
|  | @ -215,13 +215,13 @@ fn (mut p Parser) fn_decl() ast.FnDecl { | ||||||
| 		language = rec.language | 		language = rec.language | ||||||
| 	} | 	} | ||||||
| 	mut name := '' | 	mut name := '' | ||||||
| 	name_pos := p.tok.position() |  | ||||||
| 	if p.tok.kind == .name { | 	if p.tok.kind == .name { | ||||||
|  | 		pos := p.tok.position() | ||||||
| 		// TODO high order fn
 | 		// TODO high order fn
 | ||||||
| 		name = if language == .js { p.check_js_name() } else { p.check_name() } | 		name = if language == .js { p.check_js_name() } else { p.check_name() } | ||||||
| 		if language == .v && !p.pref.translated && util.contains_capital(name) && !p.builtin_mod { | 		if language == .v && !p.pref.translated && util.contains_capital(name) && !p.builtin_mod { | ||||||
| 			p.error_with_pos('function names cannot contain uppercase letters, use snake_case instead', | 			p.error_with_pos('function names cannot contain uppercase letters, use snake_case instead', | ||||||
| 				name_pos) | 				pos) | ||||||
| 			return ast.FnDecl{ | 			return ast.FnDecl{ | ||||||
| 				scope: 0 | 				scope: 0 | ||||||
| 			} | 			} | ||||||
|  | @ -229,14 +229,14 @@ fn (mut p Parser) fn_decl() ast.FnDecl { | ||||||
| 		type_sym := p.table.get_type_symbol(rec.typ) | 		type_sym := p.table.get_type_symbol(rec.typ) | ||||||
| 		// interfaces are handled in the checker, methods can not be defined on them this way
 | 		// interfaces are handled in the checker, methods can not be defined on them this way
 | ||||||
| 		if is_method && (type_sym.has_method(name) && type_sym.kind != .interface_) { | 		if is_method && (type_sym.has_method(name) && type_sym.kind != .interface_) { | ||||||
| 			p.error_with_pos('duplicate method `$name`', name_pos) | 			p.error_with_pos('duplicate method `$name`', pos) | ||||||
| 			return ast.FnDecl{ | 			return ast.FnDecl{ | ||||||
| 				scope: 0 | 				scope: 0 | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		// cannot redefine buildin function
 | 		// cannot redefine buildin function
 | ||||||
| 		if !is_method && !p.builtin_mod && name in builtin_functions { | 		if !is_method && !p.builtin_mod && name in builtin_functions { | ||||||
| 			p.error_with_pos('cannot redefine builtin function `$name`', name_pos) | 			p.error_with_pos('cannot redefine builtin function `$name`', pos) | ||||||
| 			return ast.FnDecl{ | 			return ast.FnDecl{ | ||||||
| 				scope: 0 | 				scope: 0 | ||||||
| 			} | 			} | ||||||
|  | @ -252,7 +252,8 @@ fn (mut p Parser) fn_decl() ast.FnDecl { | ||||||
| 		p.error_with_pos('cannot overload `!=`, `>`, `<=` and `>=` as they are auto generated from `==` and`<`', | 		p.error_with_pos('cannot overload `!=`, `>`, `<=` and `>=` as they are auto generated from `==` and`<`', | ||||||
| 			p.tok.position()) | 			p.tok.position()) | ||||||
| 	} else { | 	} else { | ||||||
| 		p.error_with_pos('expecting method name', name_pos) | 		pos := p.tok.position() | ||||||
|  | 		p.error_with_pos('expecting method name', pos) | ||||||
| 		return ast.FnDecl{ | 		return ast.FnDecl{ | ||||||
| 			scope: 0 | 			scope: 0 | ||||||
| 		} | 		} | ||||||
|  | @ -334,8 +335,8 @@ fn (mut p Parser) fn_decl() ast.FnDecl { | ||||||
| 		} else { | 		} else { | ||||||
| 			name = p.prepend_mod(name) | 			name = p.prepend_mod(name) | ||||||
| 		} | 		} | ||||||
| 		if p.table.known_fn(name) { | 		if _ := p.table.find_fn(name) { | ||||||
| 			p.fn_redefinition_error(name, name_pos) | 			p.fn_redefinition_error(name) | ||||||
| 		} | 		} | ||||||
| 		// p.warn('reg functn $name ()')
 | 		// p.warn('reg functn $name ()')
 | ||||||
| 		p.table.register_fn(table.Fn{ | 		p.table.register_fn(table.Fn{ | ||||||
|  | @ -807,7 +808,7 @@ fn (mut p Parser) check_fn_atomic_arguments(typ table.Type, pos token.Position) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut p Parser) fn_redefinition_error(name string, pos token.Position) { | fn (mut p Parser) fn_redefinition_error(name string) { | ||||||
| 	if p.pref.translated { | 	if p.pref.translated { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | @ -819,7 +820,7 @@ fn (mut p Parser) fn_redefinition_error(name string, pos token.Position) { | ||||||
| 	} | 	} | ||||||
| 	*/ | 	*/ | ||||||
| 	p.table.redefined_fns << name | 	p.table.redefined_fns << name | ||||||
| 	p.error_with_pos('redefinition of function `$name`', pos) | 	// p.error('redefinition of function `$name`')
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn have_fn_main(stmts []ast.Stmt) bool { | fn have_fn_main(stmts []ast.Stmt) bool { | ||||||
|  |  | ||||||
|  | @ -1,4 +0,0 @@ | ||||||
| vlib/v/parser/tests/fn_duplicate.vv:2:4: error: redefinition of function `foo` |  | ||||||
|     1 | fn foo() {} |  | ||||||
|     2 | fn foo() {} |  | ||||||
|       |    ~~~ |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| fn foo() {} |  | ||||||
| fn foo() {} |  | ||||||
		Loading…
	
		Reference in New Issue