Keep an object from being deallocated while pointers to or into it are in use. Fixes warnings like these: longrat.cc: In function 'nlMapC(snumber*, n_Procs_s*, n_Procs_s*)': longrat.cc:599:13: warning: dangling pointer to an unnamed temporary may be used [-Wdangling-pointer=] 599 | e=(*f)[0]._mp_exp-size; | ~~~~~~~~^~~~~~~ longrat.cc:573:40: note: unnamed temporary defined here 573 | mpf_t *f = ((gmp_complex*)from)->real()._mpfp(); | ~~~~~~~~~~~~~~~~~~~~~~~~~~^~ longrat.cc:581:8: warning: using dangling pointer 'size_113' to an unnamed temporary [-Wdangling-pointer=] 581 | size = (*f)[0]._mp_size; | ~~~~~^~~~~~~~~~~~~~~~~~ longrat.cc:573:40: note: unnamed temporary defined here 573 | mpf_t *f = ((gmp_complex*)from)->real()._mpfp(); | ~~~~~~~~~~~~~~~~~~~~~~~~~~^~ longrat.cc:592:6: warning: dangling pointer 'qp_115' to an unnamed temporary may be used [-Wdangling-pointer=] 592 | qp = (*f)[0]._mp_d; | ~~~^~~~~~~~~~~~~~~ longrat.cc:573:40: note: unnamed temporary defined here 573 | mpf_t *f = ((gmp_complex*)from)->real()._mpfp(); | ~~~~~~~~~~~~~~~~~~~~~~~~~~^~ --- Singular-Release-4-2-1p3/factory/cfModGcd.cc.orig 2021-12-17 11:35:18.000000000 -0700 +++ Singular-Release-4-2-1p3/factory/cfModGcd.cc 2022-07-25 14:53:41.944360644 -0600 @@ -1825,7 +1825,6 @@ gaussianElimFq (CFMatrix& M, CFArray& L, #else factoryError("NTL/FLINT missing: gaussianElimFq"); #endif - delete N; M= (*N) (1, M.rows(), 1, M.columns()); L= CFArray (M.rows()); --- Singular-Release-4-2-1p3/libpolys/coeffs/longrat.cc.orig 2021-12-17 11:35:18.000000000 -0700 +++ Singular-Release-4-2-1p3/libpolys/coeffs/longrat.cc 2022-07-25 10:59:58.720085578 -0600 @@ -570,7 +570,8 @@ static number nlMapC(number from, const return INT_TO_SR(0); } - mpf_t *f = ((gmp_complex*)from)->real()._mpfp(); + gmp_float gfl = ((gmp_complex*)from)->real(); + mpf_t *f = gfl._mpfp(); number res; mpz_ptr dest,ndest; --- Singular-Release-4-2-1p3/Singular/countedref.cc.orig 2021-12-17 11:35:18.000000000 -0700 +++ Singular-Release-4-2-1p3/Singular/countedref.cc 2022-07-25 14:51:02.519890787 -0600 @@ -317,13 +317,17 @@ public: /// Recover the actual object from Singular interpreter object static self cast(leftv arg) { assume(arg != NULL); assume(is_ref(arg)); - return self::cast(arg->Data()); + auto d = arg->Data(); + return self::cast(d); } /// If necessary dereference. static BOOLEAN resolve(leftv arg) { assume(arg != NULL); - while (is_ref(arg)) { if(CountedRef::cast(arg).dereference(arg)) return TRUE; }; + while (is_ref(arg)) { + CountedRef ref = CountedRef::cast(arg); + if (ref.dereference(arg)) return TRUE; + } return (arg->next != NULL) && resolve(arg->next); } @@ -369,8 +373,9 @@ char* countedref_String(blackbox */*b*/, /// blackbox support - copy element void* countedref_Copy(blackbox*/*b*/, void* ptr) { - if (ptr) return CountedRef::cast(ptr).outcast(); - return NULL; + if (!ptr) return NULL; + CountedRef ref = CountedRef::cast(ptr); + return ref.outcast(); } /// blackbox support - assign element @@ -383,12 +388,16 @@ BOOLEAN countedref_Assign(leftv result, } // Case: copy reference - if (result->Typ() == arg->Typ()) - return CountedRef::cast(arg).outcast(result); + if (result->Typ() == arg->Typ()) { + CountedRef ref = CountedRef::cast(arg); + return ref.outcast(result); + } // Case: new reference - if ((arg->rtyp == IDHDL) || CountedRef::is_ref(arg)) - return CountedRef(arg).outcast(result); + if ((arg->rtyp == IDHDL) || CountedRef::is_ref(arg)) { + CountedRef ref(arg); + return ref.outcast(result); + } WerrorS("Can only take reference from identifier"); return TRUE; @@ -483,7 +492,10 @@ BOOLEAN countedref_Op3(int op, leftv res /// blackbox support - destruction void countedref_destroy(blackbox */*b*/, void* ptr) { - if (ptr) CountedRef::cast(ptr).destruct(); + if (ptr) { + CountedRef ref = CountedRef::cast(ptr); + ref.destruct(); + } } @@ -539,7 +551,8 @@ public: /// Blackbox support - generate initialized, but all-zero - shared data void* countedref_InitShared(blackbox*) { - return CountedRefShared().outcast(); + auto ref = CountedRefShared(); + return ref.outcast(); } /// Blackbox support - unary operation for shared data @@ -656,23 +669,31 @@ BOOLEAN countedref_AssignShared(leftv re /// Case: new reference to already shared data if (result->Typ() == arg->Typ()) { - if (result->Data() != NULL) - CountedRefShared::cast(result).destruct(); - return CountedRefShared::cast(arg).outcast(result); + if (result->Data() != NULL) { + CountedRefShared ref = CountedRefShared::cast(result); + ref.destruct(); + } + CountedRefShared ref = CountedRefShared::cast(arg); + return ref.outcast(result); } if(CountedRefShared::cast(result).unassigned()) { - return CountedRefShared::cast(result).assign(result, arg); + CountedRefShared ref = CountedRefShared::cast(result); + return ref.assign(result, arg); } /// Case: new shared data - return CountedRefShared(arg).outcast(result); + CountedRefShared ref(arg); + return ref.outcast(result); } /// blackbox support - destruction void countedref_destroyShared(blackbox */*b*/, void* ptr) { - if (ptr) CountedRefShared::cast(ptr).destruct(); + if (ptr) { + CountedRefShared ref = CountedRefShared::cast(ptr); + ref.destruct(); + } }