mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-01 06:01:14 +00:00 
			
		
		
		
	Merge pull request #72512 from vonagam/fix-ternary-type-source
GDScript: Fix type certainty for result of ternary operator
This commit is contained in:
		
						commit
						d201df1ffa
					
				
					 5 changed files with 23 additions and 1 deletions
				
			
		|  | @ -4113,7 +4113,6 @@ void GDScriptAnalyzer::reduce_ternary_op(GDScriptParser::TernaryOpNode *p_ternar | ||||||
| 		if (!is_type_compatible(true_type, false_type)) { | 		if (!is_type_compatible(true_type, false_type)) { | ||||||
| 			result = false_type; | 			result = false_type; | ||||||
| 			if (!is_type_compatible(false_type, true_type)) { | 			if (!is_type_compatible(false_type, true_type)) { | ||||||
| 				result.type_source = GDScriptParser::DataType::UNDETECTED; |  | ||||||
| 				result.kind = GDScriptParser::DataType::VARIANT; | 				result.kind = GDScriptParser::DataType::VARIANT; | ||||||
| #ifdef DEBUG_ENABLED | #ifdef DEBUG_ENABLED | ||||||
| 				parser->push_warning(p_ternary_op, GDScriptWarning::INCOMPATIBLE_TERNARY); | 				parser->push_warning(p_ternary_op, GDScriptWarning::INCOMPATIBLE_TERNARY); | ||||||
|  | @ -4121,6 +4120,7 @@ void GDScriptAnalyzer::reduce_ternary_op(GDScriptParser::TernaryOpNode *p_ternar | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	result.type_source = true_type.is_hard_type() && false_type.is_hard_type() ? GDScriptParser::DataType::ANNOTATED_INFERRED : GDScriptParser::DataType::INFERRED; | ||||||
| 
 | 
 | ||||||
| 	p_ternary_op->set_datatype(result); | 	p_ternary_op->set_datatype(result); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | func test(): | ||||||
|  | 	var left_hard_int := 1 | ||||||
|  | 	var right_weak_int = 2 | ||||||
|  | 	var result_hm_int := left_hard_int if true else right_weak_int | ||||||
|  | 
 | ||||||
|  | 	print('not ok') | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | GDTEST_ANALYZER_ERROR | ||||||
|  | Cannot infer the type of "result_hm_int" variable because the value doesn't have a set type. | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | func test(): | ||||||
|  | 	var left_hard_int := 1 | ||||||
|  | 	var right_hard_int := 2 | ||||||
|  | 	var result_hard_int := left_hard_int if true else right_hard_int | ||||||
|  | 	assert(result_hard_int == 1) | ||||||
|  | 
 | ||||||
|  | 	var left_hard_variant := 1 as Variant | ||||||
|  | 	var right_hard_variant := 2.0 as Variant | ||||||
|  | 	var result_hard_variant := left_hard_variant if true else right_hard_variant | ||||||
|  | 	assert(result_hard_variant == 1) | ||||||
|  | 
 | ||||||
|  | 	print('ok') | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | GDTEST_OK | ||||||
|  | ok | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yuri Sizov
						Yuri Sizov