Fix compilation errors and (some) warnings for clang++.

* src/autofit/afmodule.c (AF_GlyphHintsRec): Make it static.

* src/cache/ftcache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c
(ftc_snode_compare): Remove semicolon.

* src/cff/cffparse.c (cff_parser_run): Add `break` statement.

* src/cid/cidload.c (cid_hex_to_binary): Add cast.

* src/sdf/ftbsdf.c (CHECK_NEIGHBOR): Use `do {} while(0)` loop.
(bsdf_init_distance_map, finalize_sdf, bsdf_raster_render): Add
casts.
* src/sdf/ftsdf.c (sdf_generate_bounding_box,
sdf_generate_with_overlaps): Ditto.
* src/sdf/ftsdfcommon.h (square_root): Ditto.
* src/sdf/ftsdfrend.c (sdf_property_get, ft_sdf_render,
ft_bsdf_render): Ditto.

* src/sfnt/ttcolr.c (find_base_glyph_record,
find_base_glyph_v1_record): Fix variable signedness.
(read_color_line): Add cast.
(read_paint): Add casts.
Fix signedness issue.
(tt_face_get_colorline_stops) Fix signedness issues.

* src/sfnt/ttpost.c (load_format_20): Add casts.

* src/truetype/ttsubpix.c (TWEAK_RULES, TWEAK_RULES_EXCEPTIONS):
Remove final semicolons.
diff --git a/ChangeLog b/ChangeLog
index 9d74964..2f087c6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,39 @@
 2021-05-29  Werner Lemberg  <wl@gnu.org>
 
+	Fix compilation errors and (some) warnings for clang++.
+
+	* src/autofit/afmodule.c (AF_GlyphHintsRec): Make it static.
+
+	* src/cache/ftcache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c
+	(ftc_snode_compare): Remove semicolon.
+
+	* src/cff/cffparse.c (cff_parser_run): Add `break` statement.
+
+	* src/cid/cidload.c (cid_hex_to_binary): Add cast.
+
+	* src/sdf/ftbsdf.c (CHECK_NEIGHBOR): Use `do {} while(0)` loop.
+	(bsdf_init_distance_map, finalize_sdf, bsdf_raster_render): Add
+	casts.
+	* src/sdf/ftsdf.c (sdf_generate_bounding_box,
+	sdf_generate_with_overlaps): Ditto.
+	* src/sdf/ftsdfcommon.h (square_root): Ditto.
+	* src/sdf/ftsdfrend.c (sdf_property_get, ft_sdf_render,
+	ft_bsdf_render): Ditto.
+
+	* src/sfnt/ttcolr.c (find_base_glyph_record,
+	find_base_glyph_v1_record): Fix variable signedness.
+	(read_color_line): Add cast.
+	(read_paint): Add casts.
+	Fix signedness issue.
+	(tt_face_get_colorline_stops) Fix signedness issues.
+
+	* src/sfnt/ttpost.c (load_format_20): Add casts.
+
+	* src/truetype/ttsubpix.c (TWEAK_RULES, TWEAK_RULES_EXCEPTIONS):
+	Remove final semicolons.
+
+2021-05-29  Werner Lemberg  <wl@gnu.org>
+
 	[build] Allow overriding of `ANSIFLAGS` for GNU make build.
 
 	* builds/*: Implement it.
diff --git a/src/autofit/afmodule.c b/src/autofit/afmodule.c
index 551deb7..f892268 100644
--- a/src/autofit/afmodule.c
+++ b/src/autofit/afmodule.c
@@ -48,7 +48,7 @@
   int  _af_debug_disable_blue_hints;
 
   /* we use a global object instead of a local one for debugging */
-  AF_GlyphHintsRec  _af_debug_hints_rec[1];
+  static AF_GlyphHintsRec  _af_debug_hints_rec[1];
 
   void*  _af_debug_hints = _af_debug_hints_rec;
 #endif
diff --git a/src/cache/ftccache.c b/src/cache/ftccache.c
index 823faf8..4c03242 100644
--- a/src/cache/ftccache.c
+++ b/src/cache/ftccache.c
@@ -459,7 +459,7 @@
     {
       error = cache->clazz.node_new( &node, query, cache );
     }
-    FTC_CACHE_TRYLOOP_END( NULL );
+    FTC_CACHE_TRYLOOP_END( NULL )
 
     if ( error )
       node = NULL;
diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c
index 723192f..7e24d81 100644
--- a/src/cache/ftcsbits.c
+++ b/src/cache/ftcsbits.c
@@ -395,7 +395,7 @@
         {
           error = ftc_snode_load( snode, cache->manager, gindex, &size );
         }
-        FTC_CACHE_TRYLOOP_END( list_changed );
+        FTC_CACHE_TRYLOOP_END( list_changed )
 
         ftcsnode->ref_count--;  /* unlock the node */
 
diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c
index 129ecaa..dde55e9 100644
--- a/src/cff/cffparse.c
+++ b/src/cff/cffparse.c
@@ -1516,6 +1516,7 @@
 
               case cff_kind_fixed_thousand:
                 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
+                break;
 
               default:
                 ; /* never reached */
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
index 25dcfe6..ea53d6c 100644
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -758,7 +758,7 @@
     error = FT_Err_Ok;
 
   Exit:
-    *data_written = d - data;
+    *data_written = FT_ULong( d - data );
     return error;
   }
 
diff --git a/src/sdf/ftbsdf.c b/src/sdf/ftbsdf.c
index af1e403..97e0438 100644
--- a/src/sdf/ftbsdf.c
+++ b/src/sdf/ftbsdf.c
@@ -289,19 +289,22 @@
 #undef CHECK_NEIGHBOR
 #endif
 
-#define CHECK_NEIGHBOR( x_offset, y_offset )            \
-          if ( x + x_offset >= 0 && x + x_offset < w && \
-               y + y_offset >= 0 && y + y_offset < r )  \
-          {                                             \
-            num_neighbors++;                            \
-                                                        \
-            to_check = dm + y_offset * w + x_offset;    \
-            if ( to_check->alpha == 0 )                 \
-            {                                           \
-              is_edge = 1;                              \
-              goto Done;                                \
-            }                                           \
-          }
+#define CHECK_NEIGHBOR( x_offset, y_offset )              \
+          do                                              \
+          {                                               \
+            if ( x + x_offset >= 0 && x + x_offset < w && \
+                 y + y_offset >= 0 && y + y_offset < r )  \
+            {                                             \
+              num_neighbors++;                            \
+                                                          \
+              to_check = dm + y_offset * w + x_offset;    \
+              if ( to_check->alpha == 0 )                 \
+              {                                           \
+                is_edge = 1;                              \
+                goto Done;                                \
+              }                                           \
+            }                                             \
+          } while ( 0 )
 
   static FT_Bool
   bsdf_is_edge( ED*     dm,   /* distance map              */
@@ -693,8 +696,8 @@
 
     /* Calculate the width and row differences */
     /* between target and source.              */
-    x_diff = worker->width - source->width;
-    y_diff = worker->rows - source->rows;
+    x_diff = worker->width - (int)source->width;
+    y_diff = worker->rows - (int)source->rows;
 
     x_diff /= 2;
     y_diff /= 2;
@@ -716,8 +719,8 @@
       {
         FT_Int  t_width = worker->width;
         FT_Int  t_rows  = worker->rows;
-        FT_Int  s_width = source->width;
-        FT_Int  s_rows  = source->rows;
+        FT_Int  s_width = (int)source->width;
+        FT_Int  s_rows  = (int)source->rows;
 
 
         for ( t_j = 0; t_j < t_rows; t_j++ )
@@ -750,7 +753,7 @@
             mod = 7 - s_i % 8;
 
             pixel = s[div];
-            byte  = 1 << mod;
+            byte  = (FT_Byte)( 1 << mod );
 
             t[t_index].alpha = pixel & byte ? 255 : 0;
 
@@ -764,8 +767,8 @@
       {
         FT_Int  t_width = worker->width;
         FT_Int  t_rows  = worker->rows;
-        FT_Int  s_width = source->width;
-        FT_Int  s_rows  = source->rows;
+        FT_Int  s_width = (int)source->width;
+        FT_Int  s_rows  = (int)source->rows;
 
 
         /* loop over all pixels and assign pixel values from source */
@@ -1103,8 +1106,8 @@
       goto Exit;
     }
 
-    w        = target->width;
-    r        = target->rows;
+    w        = (int)target->width;
+    r        = (int)target->rows;
     t_buffer = (FT_6D10*)target->buffer;
 
     if ( w != worker->width ||
@@ -1222,8 +1225,8 @@
     FT_Error   error  = FT_Err_Ok;
     FT_Memory  memory = NULL;
 
-    const FT_Bitmap*  source      = NULL;
-    const FT_Bitmap*  target      = NULL;
+    const FT_Bitmap*  source = NULL;
+    const FT_Bitmap*  target = NULL;
 
     BSDF_TRaster*  bsdf_raster = (BSDF_TRaster*)raster;
     BSDF_Worker    worker;
@@ -1247,8 +1250,8 @@
       goto Exit;
     }
 
-    source = sdf_params->root.source;
-    target = sdf_params->root.target;
+    source = (const FT_Bitmap*)sdf_params->root.source;
+    target = (const FT_Bitmap*)sdf_params->root.target;
 
     /* check source and target bitmap */
     if ( !source || !target )
@@ -1298,8 +1301,8 @@
                          target->width * sizeof ( *worker.distance_map ) ) )
       goto Exit;
 
-    worker.width  = target->width;
-    worker.rows   = target->rows;
+    worker.width  = (int)target->width;
+    worker.rows   = (int)target->rows;
     worker.params = *sdf_params;
 
     FT_CALL( bsdf_init_distance_map( source, &worker ) );
@@ -1309,7 +1312,7 @@
 
     FT_TRACE0(( "bsdf_raster_render: Total memory used = %ld\n",
                 worker.width * worker.rows *
-                  sizeof ( *worker.distance_map ) ));
+                  (long)sizeof ( *worker.distance_map ) ));
 
   Exit:
     if ( worker.distance_map )
diff --git a/src/sdf/ftsdf.c b/src/sdf/ftsdf.c
index a58d144..70c7a08 100644
--- a/src/sdf/ftsdf.c
+++ b/src/sdf/ftsdf.c
@@ -3222,18 +3222,19 @@
       goto Exit;
     }
 
+    if ( FT_ALLOC( dists,
+                   bitmap->width * bitmap->rows * sizeof ( *dists ) ) )
+      goto Exit;
+
     contours = shape->contours;
     width    = (FT_Int)bitmap->width;
     rows     = (FT_Int)bitmap->rows;
     buffer   = (FT_Short*)bitmap->buffer;
 
-    if ( FT_ALLOC( dists, width * rows * sizeof ( *dists ) ) )
-      goto Exit;
-
     if ( USE_SQUARED_DISTANCES )
-      sp_sq = FT_INT_16D16( spread * spread );
+      sp_sq = (FT_Int)FT_INT_16D16( spread * spread );
     else
-      sp_sq = FT_INT_16D16( spread );
+      sp_sq = (FT_Int)FT_INT_16D16( spread );
 
     if ( width == 0 || rows == 0 )
     {
@@ -3307,9 +3308,9 @@
               dist.distance = square_root( dist.distance );
 
             if ( internal_params.flip_y )
-              index = y * width + x;
+              index = FT_UInt( y * width + x );
             else
-              index = ( rows - y - 1 ) * width + x;
+              index = FT_UInt( ( rows - y - 1 ) * width + x );
 
             /* check whether the pixel is set or not */
             if ( dists[index].sign == 0 )
@@ -3341,7 +3342,7 @@
 
       for ( i = 0; i < width; i++ )
       {
-        index = j * width + i;
+        index = (FT_UInt)( j * width + i );
 
         /* if the pixel is not set                     */
         /* its shortest distance is more than `spread` */
@@ -3527,11 +3528,13 @@
     }
 
     /* allocate the bitmaps to generate SDF for separate contours */
-    if ( FT_ALLOC( bitmaps, num_contours * sizeof ( *bitmaps ) ) )
+    if ( FT_ALLOC( bitmaps,
+                   (FT_UInt)num_contours * sizeof ( *bitmaps ) ) )
       goto Exit;
 
     /* allocate array to hold orientation for all contours */
-    if ( FT_ALLOC( orientations, num_contours * sizeof ( *orientations ) ) )
+    if ( FT_ALLOC( orientations,
+                   (FT_UInt)num_contours * sizeof ( *orientations ) ) )
       goto Exit;
 
     /* Disable `flip_sign` to avoid extra complication */
@@ -3554,7 +3557,8 @@
       bitmaps[i].pixel_mode = bitmap->pixel_mode;
 
       /* allocate memory for the buffer */
-      if ( FT_ALLOC( bitmaps[i].buffer, bitmap->rows * bitmap->pitch ) )
+      if ( FT_ALLOC( bitmaps[i].buffer,
+                     bitmap->rows * (FT_UInt)bitmap->pitch ) )
         goto Exit;
 
       /* determine the orientation */
diff --git a/src/sdf/ftsdfcommon.h b/src/sdf/ftsdfcommon.h
index 7c55817..925a4dc 100644
--- a/src/sdf/ftsdfcommon.h
+++ b/src/sdf/ftsdfcommon.h
@@ -139,7 +139,7 @@
     FT_ULong  t, q, b, r;
 
 
-    r = val;
+    r = (FT_ULong)val;
     b = 0x40000000L;
     q = 0;
 
@@ -159,7 +159,7 @@
 
     q >>= 8;
 
-    return q;
+    return (FT_16D16)q;
   }
 
 
diff --git a/src/sdf/ftsdfrend.c b/src/sdf/ftsdfrend.c
index 3226bdc..fa2fd6d 100644
--- a/src/sdf/ftsdfrend.c
+++ b/src/sdf/ftsdfrend.c
@@ -142,7 +142,7 @@
 
     if ( ft_strcmp( property_name, "spread" ) == 0 )
     {
-      FT_Int*  val = (FT_Int*)value;
+      FT_UInt*  val = (FT_UInt*)value;
 
 
       *val = render->spread;
@@ -314,7 +314,7 @@
 
     /* ignore the pitch, pixel mode and set custom */
     bitmap->pixel_mode = FT_PIXEL_MODE_GRAY16;
-    bitmap->pitch      = bitmap->width * 2;
+    bitmap->pitch      = (int)( bitmap->width * 2 );
     bitmap->num_grays  = 65535;
 
     /* allocate new buffer */
@@ -525,7 +525,7 @@
 
     /* set up the target bitmap */
     target.pixel_mode = FT_PIXEL_MODE_GRAY16;
-    target.pitch      = target.width * 2;
+    target.pitch      = (int)( target.width * 2 );
     target.num_grays  = 65535;
 
     if ( FT_ALLOC_MULT( target.buffer, target.rows, target.pitch ) )
diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c
index f3f396a..632547f 100644
--- a/src/sfnt/ttcolr.c
+++ b/src/sfnt/ttcolr.c
@@ -228,17 +228,17 @@
 
   static FT_Bool
   find_base_glyph_record( FT_Byte*          base_glyph_begin,
-                          FT_Int            num_base_glyph,
+                          FT_UInt           num_base_glyph,
                           FT_UInt           glyph_id,
                           BaseGlyphRecord*  record )
   {
-    FT_Int  min = 0;
-    FT_Int  max = num_base_glyph - 1;
+    FT_UInt  min = 0;
+    FT_UInt  max = num_base_glyph - 1;
 
 
     while ( min <= max )
     {
-      FT_Int    mid = min + ( max - min ) / 2;
+      FT_UInt   mid = min + ( max - min ) / 2;
       FT_Byte*  p   = base_glyph_begin + mid * BASE_GLYPH_SIZE;
 
       FT_UShort  gid = FT_NEXT_USHORT( p );
@@ -327,7 +327,7 @@
     FT_PaintExtend  paint_extend;
 
 
-    paint_extend = FT_NEXT_BYTE( p );
+    paint_extend = (FT_PaintExtend)FT_NEXT_BYTE( p );
     if ( paint_extend > FT_COLR_PAINT_EXTEND_REFLECT )
       return 0;
 
@@ -392,7 +392,7 @@
          p >= ( (FT_Byte*)colr->table + colr->table_size ) )
       return 0;
 
-    apaint->format = FT_NEXT_BYTE( p );
+    apaint->format = (FT_PaintFormat)FT_NEXT_BYTE( p );
 
     if ( apaint->format >= FT_COLR_PAINT_FORMAT_MAX )
       return 0;
@@ -425,8 +425,8 @@
 
     else if ( apaint->format == FT_COLR_PAINTFORMAT_SOLID )
     {
-      apaint->u.solid.color.palette_index = FT_NEXT_USHORT ( p );
-      apaint->u.solid.color.alpha         = FT_NEXT_USHORT ( p );
+      apaint->u.solid.color.palette_index = FT_NEXT_USHORT( p );
+      apaint->u.solid.color.alpha         = FT_NEXT_SHORT( p );
 
       return 1;
     }
@@ -454,12 +454,12 @@
                              &apaint->u.linear_gradient.colorline ) )
         return 0;
 
-      apaint->u.linear_gradient.p0.x = FT_NEXT_SHORT ( p );
-      apaint->u.linear_gradient.p0.y = FT_NEXT_SHORT ( p );
-      apaint->u.linear_gradient.p1.x = FT_NEXT_SHORT ( p );
-      apaint->u.linear_gradient.p1.y = FT_NEXT_SHORT ( p );
-      apaint->u.linear_gradient.p2.x = FT_NEXT_SHORT ( p );
-      apaint->u.linear_gradient.p2.y = FT_NEXT_SHORT ( p );
+      apaint->u.linear_gradient.p0.x = FT_NEXT_SHORT( p );
+      apaint->u.linear_gradient.p0.y = FT_NEXT_SHORT( p );
+      apaint->u.linear_gradient.p1.x = FT_NEXT_SHORT( p );
+      apaint->u.linear_gradient.p1.y = FT_NEXT_SHORT( p );
+      apaint->u.linear_gradient.p2.x = FT_NEXT_SHORT( p );
+      apaint->u.linear_gradient.p2.y = FT_NEXT_SHORT( p );
 
       return 1;
     }
@@ -470,15 +470,15 @@
                              &apaint->u.radial_gradient.colorline ) )
         return 0;
 
-      apaint->u.radial_gradient.c0.x = FT_NEXT_SHORT ( p );
-      apaint->u.radial_gradient.c0.y = FT_NEXT_SHORT ( p );
+      apaint->u.radial_gradient.c0.x = FT_NEXT_SHORT( p );
+      apaint->u.radial_gradient.c0.y = FT_NEXT_SHORT( p );
 
-      apaint->u.radial_gradient.r0 = FT_NEXT_USHORT ( p );
+      apaint->u.radial_gradient.r0 = FT_NEXT_USHORT( p );
 
-      apaint->u.radial_gradient.c1.x = FT_NEXT_SHORT ( p );
-      apaint->u.radial_gradient.c1.y = FT_NEXT_SHORT ( p );
+      apaint->u.radial_gradient.c1.x = FT_NEXT_SHORT( p );
+      apaint->u.radial_gradient.c1.y = FT_NEXT_SHORT( p );
 
-      apaint->u.radial_gradient.r1 = FT_NEXT_USHORT ( p );
+      apaint->u.radial_gradient.r1 = FT_NEXT_USHORT( p );
 
       return 1;
     }
@@ -489,8 +489,8 @@
                              &apaint->u.sweep_gradient.colorline ) )
         return 0;
 
-      apaint->u.sweep_gradient.center.x = FT_NEXT_SHORT ( p );
-      apaint->u.sweep_gradient.center.y = FT_NEXT_SHORT ( p );
+      apaint->u.sweep_gradient.center.x = FT_NEXT_SHORT( p );
+      apaint->u.sweep_gradient.center.y = FT_NEXT_SHORT( p );
 
       apaint->u.sweep_gradient.start_angle = FT_NEXT_LONG( p );
       apaint->u.sweep_gradient.end_angle = FT_NEXT_LONG( p );
@@ -572,7 +572,7 @@
       if ( composite_mode >= FT_COLR_COMPOSITE_MAX )
         return 0;
 
-      apaint->u.composite.composite_mode = composite_mode;
+      apaint->u.composite.composite_mode = (FT_Composite_Mode)composite_mode;
 
       if ( !get_child_table_pointer( colr, paint_base, &p, &child_table_p ) )
          return 0;
@@ -591,17 +591,17 @@
 
   static FT_Bool
   find_base_glyph_v1_record ( FT_Byte *           base_glyph_begin,
-                              FT_Int              num_base_glyph,
+                              FT_UInt             num_base_glyph,
                               FT_UInt             glyph_id,
                               BaseGlyphV1Record  *record )
   {
-    FT_Int  min = 0;
-    FT_Int  max = num_base_glyph - 1;
+    FT_UInt  min = 0;
+    FT_UInt  max = num_base_glyph - 1;
 
 
     while ( min <= max )
     {
-      FT_Int  mid = min + ( max - min ) / 2;
+      FT_UInt  mid = min + ( max - min ) / 2;
 
       /*
        * `base_glyph_begin` is the beginning of `BaseGlyphV1List`;
@@ -763,11 +763,11 @@
     /* Iterator points at first `ColorStop` of `ColorLine`. */
     p = iterator->p;
 
-    color_stop->stop_offset = FT_NEXT_USHORT ( p );
+    color_stop->stop_offset = FT_NEXT_SHORT( p );
 
-    color_stop->color.palette_index = FT_NEXT_USHORT ( p );
+    color_stop->color.palette_index = FT_NEXT_USHORT( p );
 
-    color_stop->color.alpha = FT_NEXT_USHORT ( p );
+    color_stop->color.alpha = FT_NEXT_SHORT( p );
 
     iterator->p = p;
     iterator->current_color_stop++;
diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c
index 5ce7706..427c3f4 100644
--- a/src/sfnt/ttpost.c
+++ b/src/sfnt/ttpost.c
@@ -180,8 +180,8 @@
     /* There already exist fonts which have more than 32768 glyph names */
     /* in this table, so the test for this threshold has been dropped.  */
 
-    if ( num_glyphs > face->max_profile.numGlyphs ||
-         num_glyphs * 2UL > post_len - 2          )
+    if ( num_glyphs > face->max_profile.numGlyphs  ||
+         (FT_ULong)num_glyphs * 2UL > post_len - 2 )
     {
       error = FT_THROW( Invalid_File_Format );
       goto Exit;
@@ -231,7 +231,7 @@
       FT_ULong   p;
 
 
-      post_len -= num_glyphs * 2UL + 2;
+      post_len -= (FT_ULong)num_glyphs * 2UL + 2;
 
       if ( FT_QALLOC( strings, post_len + 1 )       ||
            FT_STREAM_READ( strings, post_len )      ||
diff --git a/src/truetype/ttsubpix.c b/src/truetype/ttsubpix.c
index 460f712..e3b523e 100644
--- a/src/truetype/ttsubpix.c
+++ b/src/truetype/ttsubpix.c
@@ -891,12 +891,12 @@
 #define TWEAK_RULES( x )                                       \
   if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
                        x##_Rules, x##_RULES_SIZE ) )           \
-    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;
+    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x
 
 #define TWEAK_RULES_EXCEPTIONS( x )                                        \
   if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \
                        x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
-    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;
+    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x
 
 
   FT_LOCAL_DEF( void )