When I am using Delphi Berlin 10.1 [weak] (and [unsafe]) reference, the "Supports" function and "QueryInterface" both are incrementing the reference count when given an interface variable marked with the "weak" attribute (same behavior with "unsafe" attribute).
program WeakReferences;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
type
   IAnInterfacedObject = interface
   ['{351DFDA3-42CA-4A1D-8488-494CA454FD9C}']
   end;
   TAnInterfacedObject = class(TInterfacedObject, IAnInterfacedObject)
     protected
      function  GetTheReferenceCount : integer;
     public
      constructor Create;
      destructor  Destroy; override;
      property    TheReferenceCount : integer read GetTheReferenceCount;
   end;
   constructor TAnInterfacedObject.Create;
   begin
      inherited Create;
      writeln('(create AIO instance)');
   end;
   destructor TAnInterfacedObject.Destroy;
   begin
      writeln('(destroy AIO instance)');
      inherited Destroy;
   end;
   function TAnInterfacedObject.GetTheReferenceCount : integer;
   begin
      Result := FRefCount;
   end;
   procedure WithoutSupports;
   var
      AIOinstance : TAnInterfacedObject;
      AIOinterfaced : IAnInterfacedObject;
      [Weak]
      WeakAIOinterfaced : IAnInterfacedObject;
   begin
      AIOinstance := TAnInterfacedObject.Create;
      writeln('created AIO instance; refcount: '+AIOinstance.TheReferenceCount.ToString);
      AIOinterfaced := AIOinstance;
      writeln('create AIO interfaced; refcount: '+AIOinstance.TheReferenceCount.ToString);
      WeakAIOinterfaced := AIOinstance;
      writeln('create WEAK AIO interfaced; refcount: '+AIOinstance.TheReferenceCount.ToString);
   end;
   procedure WithSupports_Weak;
   var
      AIOinstance : TAnInterfacedObject;
      AIOinterfaced : IAnInterfacedObject;
      [Weak]
      WeakAIOinterfaced : IAnInterfacedObject;
   begin
      AIOinstance := TAnInterfacedObject.Create;
      writeln('created AIO instance; refcount: '+AIOinstance.TheReferenceCount.ToString);
      AIOinterfaced := AIOinstance;
      writeln('create AIO interfaced; refcount: '+AIOinstance.TheReferenceCount.ToString);
      Supports(AIOinstance, IAnInterfacedObject, WeakAIOinterfaced);
      writeln('create WEAK AIO interfaced with SUPPORTS; refcount: '+AIOinstance.TheReferenceCount.ToString);
   end;
   procedure WithSupports_Unsafe;
   var
      AIOinstance : TAnInterfacedObject;
      AIOinterfaced : IAnInterfacedObject;
      [Unsafe]
      UnsafeAIOinterfaced : IAnInterfacedObject;
   begin
      AIOinstance := TAnInterfacedObject.Create;
      writeln('created AIO instance; refcount: '+AIOinstance.TheReferenceCount.ToString);
      AIOinterfaced := AIOinstance;
      writeln('create AIO interfaced; refcount: '+AIOinstance.TheReferenceCount.ToString);
      Supports(AIOinstance, IAnInterfacedObject, UnsafeAIOinterfaced);
      writeln('create UNSAFE AIO interfaced with SUPPORTS; refcount: '+AIOinstance.TheReferenceCount.ToString);
   end;
   procedure WithQueryInterface_Weak;
   var
      AIOinstance : TAnInterfacedObject;
      AIOinterfaced : IAnInterfacedObject;
      [Weak]
      WeakAIOinterfaced : IAnInterfacedObject;
   begin
      AIOinstance := TAnInterfacedObject.Create;
      writeln('created AIO instance; refcount: '+AIOinstance.TheReferenceCount.ToString);
      AIOinterfaced := AIOinstance;
      writeln('create AIO interfaced; refcount: '+AIOinstance.TheReferenceCount.ToString);
      AIOinterfaced.QueryInterface(IAnInterfacedObject, WeakAIOinterfaced);
      writeln('create WEAK AIO interfaced with QUERYINTERFACE; refcount: '+AIOinstance.TheReferenceCount.ToString);
   end;
begin
  try
     writeln('--Without "Supports"-------------------');
     WithoutSupports;
     writeln;
     writeln('--With "Supports" - weak-------------------');
     WithSupports_Weak;
     writeln;
     writeln('--With "Supports" - unsafe-------------------');
     WithSupports_Unsafe;
     writeln;
     writeln('--With "QueryInterface" - weak-------------------');
     WithQueryInterface_Weak;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
What have I missed here? Is there a "WeakSupports" function? Is this a bug or just a shortcoming of the new "weak" interfaces feature?
 
    