Support for Clang.
diff --git a/README b/README
index cc41768..54d37a2 100644
--- a/README
+++ b/README
@@ -36,7 +36,7 @@
   PATH — path to the install tree of a library
 
 COMPATIBILITY:
-  ABI Compliance Checker >= 1.99.14 (https://github.com/lvc/abi-compliance-checker)
+  ABI Compliance Checker >= 1.99.24 (https://github.com/lvc/abi-compliance-checker)
 
 ADV. USAGE:
   For advanced usage, see output of --help option.
diff --git a/abi-dumper.pl b/abi-dumper.pl
index b213037..cc00772 100644
--- a/abi-dumper.pl
+++ b/abi-dumper.pl
@@ -22,7 +22,7 @@
 #
 # COMPATIBILITY
 # =============
-#  ABI Compliance Checker >= 1.99.14
+#  ABI Compliance Checker >= 1.99.24
 #
 #
 # This program is free software: you can redistribute it and/or modify
@@ -361,6 +361,7 @@
     "reference_type"=>"Ref",
     "rvalue_reference_type"=>"RvalueRef",
     "volatile_type"=>"Volatile",
+    "restrict_type"=>"Restrict",
     "typedef"=>"Typedef",
     "ptr_to_member_type"=>"FieldPtr",
     "string_type"=>"String"
@@ -371,6 +372,7 @@
     "Ref"=>"&",
     "RvalueRef"=>"&&",
     "Volatile"=>"volatile",
+    "Restrict"=>"restrict",
     "Const"=>"const"
 );
 
@@ -406,6 +408,7 @@
 my $SYS_ARCH;
 my $SYS_WORD;
 my $SYS_GCCV;
+my $SYS_CLANGV = undef;
 my $SYS_COMP;
 my $LIB_LANG;
 my $OBJ_LANG;
@@ -1562,6 +1565,9 @@
                                     }
                                 }
                             }
+                            elsif($Val=~/clang\s+version\s+([^\s\(]+)/) {
+                                $SYS_CLANGV = $1;
+                            }
                             else {
                                 $SYS_COMP = $Val;
                             }
@@ -1859,6 +1865,9 @@
     if($SYS_GCCV) {
         $ABI{"GccVersion"} = $SYS_GCCV;
     }
+    elsif($SYS_CLANGV) {
+        $ABI{"ClangVersion"} = $SYS_CLANGV;
+    }
     else {
         $ABI{"Compiler"} = $SYS_COMP;
     }
@@ -3105,6 +3114,20 @@
         }
     }
     
+    if(defined $SYS_CLANGV
+    and $TInfo{"Type"} eq "FieldPtr")
+    { # Support for Clang
+        if(my $T = $DWARF_Info{$ID}{"type"})
+        {
+            if($DWARF_Info{$T}{"Kind"} eq "subroutine_type")
+            {
+                $TInfo{"Type"} = "MethodPtr";
+                $DWARF_Info{$ID}{"sibling"} = $T;
+                $DWARF_Info{$T}{"object_pointer"} = $DWARF_Info{$ID}{"containing_type"};
+            }
+        }
+    }
+    
     my $RealType = $TInfo{"Type"};
     
     if(defined $ClassMethods{$ID})
@@ -3286,6 +3309,27 @@
         }
     }
     
+    if($TInfo{"Type"} eq "Struct")
+    {
+        if(not $TInfo{"Name"}
+        and my $Sb = $DWARF_Info{$ID}{"sibling"})
+        {
+            if($DWARF_Info{$Sb}{"Kind"} eq "subroutine_type"
+            and defined $TInfo{"Memb"}
+            and $TInfo{"Memb"}{0}{"name"} eq "__pfn")
+            { # __pfn and __delta
+                $TInfo{"Type"} = "MethodPtr";
+            }
+        }
+    }
+    
+    if($TInfo{"Type"}=~/Pointer|Ptr|Ref/)
+    {
+        if(not $TInfo{"Size"}) {
+            $TInfo{"Size"} = $SYS_WORD;
+        }
+    }
+    
     if($TInfo{"Type"} eq "Pointer")
     {
         if($DWARF_Info{$TInfo{"BaseType"}}{"Kind"} eq "subroutine_type")
@@ -3304,60 +3348,54 @@
     {
         init_FuncType(\%TInfo, $ID, "Func");
     }
-    elsif($TInfo{"Type"} eq "Struct")
+    elsif($TInfo{"Type"} eq "MethodPtr")
     {
-        if(not $TInfo{"Name"}
-        and my $Sb = $DWARF_Info{$ID}{"sibling"})
+        if(my $Sb = $DWARF_Info{$ID}{"sibling"})
         {
-            if($DWARF_Info{$Sb}{"Kind"} eq "subroutine_type"
-            and defined $TInfo{"Memb"}
-            and $TInfo{"Memb"}{0}{"name"} eq "__pfn")
-            { # __pfn and __delta
-                $TInfo{"Type"} = "MethodPtr";
+            my @Prms = ();
+            my $PPos = 0;
+            foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$FuncParam{$Sb}}))
+            {
+                my $ParamId = $FuncParam{$Sb}{$Pos};
+                my %PInfo = %{$DWARF_Info{$ParamId}};
                 
-                my @Prms = ();
-                my $PPos = 0;
-                foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$FuncParam{$Sb}}))
+                if(defined $PInfo{"artificial"})
+                { # this
+                    next;
+                }
+                
+                if(my $PTypeId = $PInfo{"type"})
                 {
-                    my $ParamId = $FuncParam{$Sb}{$Pos};
-                    my %PInfo = %{$DWARF_Info{$ParamId}};
-                    
-                    if(defined $PInfo{"artificial"})
-                    { # this
-                        next;
-                    }
-                    
-                    if(my $PTypeId = $PInfo{"type"})
-                    {
-                        $TInfo{"Param"}{$PPos}{"type"} = $PTypeId;
-                        getTypeInfo($PTypeId);
-                        push(@Prms, $TypeInfo{$PTypeId}{"Name"});
-                    }
-                    
-                    $PPos += 1;
+                    $TInfo{"Param"}{$PPos}{"type"} = $PTypeId;
+                    getTypeInfo($PTypeId);
+                    push(@Prms, $TypeInfo{$PTypeId}{"Name"});
                 }
                 
-                if(my $ClassId = $DWARF_Info{$Sb}{"object_pointer"})
-                {
-                    while($DWARF_Info{$ClassId}{"type"}) {
-                        $ClassId = $DWARF_Info{$ClassId}{"type"};
-                    }
-                    $TInfo{"Class"} = $ClassId;
-                    getTypeInfo($TInfo{"Class"});
-                }
-                
-                if($TInfo{"Return"} = $DWARF_Info{$Sb}{"type"}) {
-                    getTypeInfo($TInfo{"Return"});
-                }
-                else
-                { # void
-                    $TInfo{"Return"} = "1";
-                }
-                
-                $TInfo{"Name"} = $TypeInfo{$TInfo{"Return"}}{"Name"};
-                $TInfo{"Name"} .= "(".$TypeInfo{$TInfo{"Class"}}{"Name"}."::*)";
-                $TInfo{"Name"} .= "(".join(",", @Prms).")";
+                $PPos += 1;
             }
+            
+            if(my $ClassId = $DWARF_Info{$Sb}{"object_pointer"})
+            {
+                while($DWARF_Info{$ClassId}{"type"}) {
+                    $ClassId = $DWARF_Info{$ClassId}{"type"};
+                }
+                $TInfo{"Class"} = $ClassId;
+                getTypeInfo($TInfo{"Class"});
+            }
+            
+            if($TInfo{"Return"} = $DWARF_Info{$Sb}{"type"}) {
+                getTypeInfo($TInfo{"Return"});
+            }
+            else
+            { # void
+                $TInfo{"Return"} = "1";
+            }
+            
+            $TInfo{"Name"} = $TypeInfo{$TInfo{"Return"}}{"Name"};
+            $TInfo{"Name"} .= "(".$TypeInfo{$TInfo{"Class"}}{"Name"}."::*)";
+            $TInfo{"Name"} .= "(".join(",", @Prms).")";
+            
+            delete($TInfo{"BaseType"});
         }
     }
     elsif($TInfo{"Type"} eq "FieldPtr")