Compile fixes for Clang 10.
M core/core/collections/hash_map.h +1 -1
@@ 367,7 367,7 @@ private:
 	void allocate(uint32_t hit_size)
 	{
 		_hash_hit_size = hit_size;
-		_hash_miss_size = static_cast<uint32_t>(hit_size * empty_region_percentage * 0.01f);
+		_hash_miss_size = static_cast<uint32_t>(static_cast<float>(hit_size) * empty_region_percentage * 0.01f);
 		_hash_hit_free = _hash_hit_size;
 		_hash_miss_free = _hash_miss_size;
 

          
M core/core/debug/timer.cpp +1 -1
@@ 16,7 16,7 @@ TimerScope::~TimerScope()
 	auto now = std::chrono::system_clock::now();
 	auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - _start_time);
 
-	debug() << _name << " took " << duration.count() / 1000.0 << '\n';
+	debug() << _name << " took " << static_cast<double>(duration.count()) / 1000.0 << '\n';
 }
 
 } // namespace core

          
M core/core/strings/murmur_hash.cpp +2 -2
@@ 162,7 162,7 @@ uint64_t unaligned_murmur_hash3_x64_64(c
 		DECLARE_SWITCH_FALLTHROUGH
 	case  1: k1 ^= static_cast<uint64_t>(tail[0]) << 0;
 		k1 *= c1; k1 = ROTL64(k1, 31); k1 *= c2; h1 ^= k1;
-	};
+	}
 
 	//----------
 	// finalization

          
@@ 258,7 258,7 @@ uint64_t murmur_hash3_x64_64(const void 
 		DECLARE_SWITCH_FALLTHROUGH
 	case  1: k1 ^= static_cast<uint64_t>(tail[0]) << 0;
 		k1 *= c1; k1 = ROTL64(k1, 31); k1 *= c2; h1 ^= k1;
-	};
+	}
 
 	//----------
 	// finalization

          
M jasm/assemble/assembler_impl/expressions_impl.cpp +1 -1
@@ 205,7 205,7 @@ void Assembler::recurse_evaluate_express
 		case ExpressionComponentType::Operator:
 			evaluate_operator(generate, expression_values, components, root_index);
 			break;
-	};
+	}
 }
 
 const Value &Assembler::evaluate_expression_tree(bool generate, ValueVector &expression_values, const ExpressionComponent components[], uint32_t num_components)

          
M jasm/assemble/value.cpp +1 -1
@@ 67,7 67,7 @@ std::string_view to_string(ValueType typ
 	case ValueType::MethodClosure:
 		return std::string_view("method closure");
 	case ValueType::NumTypes:
-		return nullptr;
+		return std::string_view();
 	}
 	UNREACHABLE_CODE(return std::string_view());
 }

          
M jasm/processor/z80/processor_z80.cpp +1 -1
@@ 413,7 413,7 @@ const Token *ProcessorZ80::parse_and_out
 		case InstructionArgumentType::NumTypes:
 			assert(false);
 			throw AssemblyException("Internal error");
-	};
+	}
 	return t;
 }
 

          
M jasm/syntax/syntax_parser.cpp +74 -74
@@ 2462,86 2462,86 @@ const Token *SyntaxParser::parse_inner_s
 		t = skip_whitespaces(t);
 
 		switch (t->type) {
-		case TokenType::Keyword:
-			t = parse_keyword(t);
-			break;
-
-		case TokenType::Symbol:
-		{
-			uint8_t instruction = invalid_instruction;
-			if (is_instruction(*t, instruction)) {
-				t = _processor->parse_instruction(*this, _source_files, t, instruction);
-			} else {
-				t = parse_label_or_statement(t);
-			}
-			break;
-		}
-		case TokenType::Operator:
-		{
-			if (t->operator_index == OperatorType::Semicolon) {
-				// semicolon to separate statements are ok
-				t = consume_next_token();
+			case TokenType::Keyword:
+				t = parse_keyword(t);
 				break;
-			}
-
-			// check for period in local labels
-			if (t->operator_index == OperatorType::Period) {
-				t = parse_label_or_statement(t);
-				break;
-			}
-
-			// check for scope start/end
-			if (t->operator_index == OperatorType::LeftCurly) {
-				t = parse_scope(t);
+
+			case TokenType::Symbol:
+			{
+				uint8_t instruction = invalid_instruction;
+				if (is_instruction(*t, instruction)) {
+					t = _processor->parse_instruction(*this, _source_files, t, instruction);
+				} else {
+					t = parse_label_or_statement(t);
+				}
 				break;
 			}
-			if (t->operator_index == OperatorType::RightCurly)
+			case TokenType::Operator:
+			{
+				if (t->operator_index == OperatorType::Semicolon) {
+					// semicolon to separate statements are ok
+					t = consume_next_token();
+					break;
+				}
+
+				// check for period in local labels
+				if (t->operator_index == OperatorType::Period) {
+					t = parse_label_or_statement(t);
+					break;
+				}
+
+				// check for scope start/end
+				if (t->operator_index == OperatorType::LeftCurly) {
+					t = parse_scope(t);
+					break;
+				}
+				if (t->operator_index == OperatorType::RightCurly)
+					return t;
+
+				constexpr bool end_at_unmatched_parenthesis = false;
+				constexpr bool end_at_newline = false;
+				t = parse_and_output_expression(t, end_at_unmatched_parenthesis, end_at_newline);
+				break;
+			}
+
+			case TokenType::Boolean:
+			case TokenType::Char:
+			case TokenType::Integer:
+			case TokenType::Float:
+			case TokenType::String:
+			case TokenType::Typename:
+			{
+				constexpr bool end_at_unmatched_parenthesis = false;
+				constexpr bool end_at_newline = false;
+				t = parse_and_output_expression(t, end_at_unmatched_parenthesis, end_at_newline);
+				break;
+			}
+
+			case TokenType::End:
 				return t;
 
-			constexpr bool end_at_unmatched_parenthesis = false;
-			constexpr bool end_at_newline = false;
-			t = parse_and_output_expression(t, end_at_unmatched_parenthesis, end_at_newline);
-			break;
-		}
-
-		case TokenType::Boolean:
-		case TokenType::Char:
-		case TokenType::Integer:
-		case TokenType::Float:
-		case TokenType::String:
-		case TokenType::Typename:
-		{
-			constexpr bool end_at_unmatched_parenthesis = false;
-			constexpr bool end_at_newline = false;
-			t = parse_and_output_expression(t, end_at_unmatched_parenthesis, end_at_newline);
-			break;
+			case TokenType::ProcessorKeyword:
+			{
+				std::stringstream ss;
+				ss << "Unexpected " << to_string(t->type);
+				throw AssemblyException(_source_files, t->source_location, AssemblyErrorCodes::UnexpectedProcessorKeyword, ss.str());
+			}
+
+			case TokenType::Processor:
+				t = parse_processor(t);
+				break;
+			
+			case TokenType::Whitespace:
+			case TokenType::Newline:
+				// this should never happen since whitespace has already been skipped
+			case TokenType::NumTypes:
+			{
+				assert(false);
+				std::stringstream ss;
+				ss << "Internal error: unexpected token " << to_string(t->type);
+				throw AssemblyException(_source_files, t->source_location, AssemblyErrorCodes::InternalError, ss.str());
+			}
 		}
-
-		case TokenType::End:
-			return t;
-
-		case TokenType::ProcessorKeyword:
-		{
-			std::stringstream ss;
-			ss << "Unexpected " << to_string(t->type);
-			throw AssemblyException(_source_files, t->source_location, AssemblyErrorCodes::UnexpectedProcessorKeyword, ss.str());
-		}
-
-		case TokenType::Processor:
-			t = parse_processor(t);
-			break;
-		
-		case TokenType::Whitespace:
-		case TokenType::Newline:
-			// this should never happen since whitespace has already been skipped
-		case TokenType::NumTypes:
-		{
-			assert(false);
-			std::stringstream ss;
-			ss << "Internal error: unexpected token " << to_string(t->type);
-			throw AssemblyException(_source_files, t->source_location, AssemblyErrorCodes::InternalError, ss.str());
-		}
-		};
 	}
 }