Stuff in Phobos That Generates Garbage

From D Wiki
Revision as of 22:24, 16 October 2014 by Eco (talk | contribs) (Potential solutions =: Syntax typo)
Jump to: navigation, search

Potential solutions

Closure allocations

CL01: Fixable by manually stack-allocating closure

  A delegate is passed to some function which stores this delegate and
  therefore correctly doesn't mark the parameter as scope. However,
  the lifetime of the stored delegate is still limited to the current
  function (e.g. it's stored in a struct instance, but on the stack).
  Can be fixed by creating a static struct{T... members; void
  doSomething(){access members}} instance on stack and passing
  &stackvar.doSomething as delegate.

CL02: Using delegates to add state to ranges

  ----
  return iota(dim).
    filter!(i => ptr[i])().
    map!(i => BitsSet!size_t(ptr[i], i * bitsPerSizeT))().
    joiner();
  ----
  This code adds state to ranges without declaring a new type: the ptr
  variable is not accessible and needs to be move into a closure.
  Declaring a custom range type is a solution, but not
  straightforward: If the ptr field is moved into the range a closure
  is not necessary. But if the range is copied, it's address changes
  and the delegate passed to map is now invalid.

CL03: Functions taking delegates as generic parameters

  receiveTimeout,receive,formattedWrite accept different types,
  including delegates. The delegates can all be scope to avoid the
  allocation but is void foo(T)(scope T) a good idea? The alternative
  is probably making an overload for delegates with scope attribute.
  (The result is that all functions calling receiveTimeout,... with a
  delegate allocate a closure)

CL04: Solvable with manual memory management

  Some specific functions can't be easily fixed, but the delegates
  they create have a well defined lifetime (for example spawn creates
  a delegate which is only needed at the startup of a new thread, it's
  never used again). These could be malloc+freed.

CL05: Design issue

  These functions generally create a delegate using variables passed
  in as parameters. There's no way to avoid closures here. Although
  manual allocation is an possible, the lifetime is undefined and can
  only be managed by the GC.

CL06: Other

  Two cases can be fixed by moving a buffer into a struct or moving a
  function out of a member function into it's surrounding class.

Labeled data

Here are the results based on the compiler's report (building Phobos unittests with -vgc flag of DMD).

For templates only code that is _instantiated_ by unittests build is accounted for (~ all covered code).

The tool used to post-process -vgc output can be found here, it's not tied to Phobos and should work with any github-based project (to be extended).


Module Artifact Reason Possible Fix(es)
std.algorithm BoyerMooreFinder.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2

std.algorithm Levenshtein.AllocMatrix 'delete' requires GC;

'new' causes GC allocation 1 2

std.algorithm Levenshtein.path operator ~= may cause GC allocation 1 2 3
std.algorithm SplitterResult.front 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm SplitterResult.popFront 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm TimSortImpl.ensureCapacity setting 'length' may cause GC allocation 1
std.algorithm TimSortImpl.sort setting 'length' may cause GC allocation 1
std.algorithm back 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm castSwitch 'new' causes GC allocation;

using closure causes GC allocation 1 2 3 4 5

std.algorithm commonPrefix 'new' causes GC allocation 1
std.algorithm front 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm largestPartialIntersection using closure causes GC allocation 1
std.algorithm largestPartialIntersectionWeighted.heapComp indexing an associative array may cause GC allocation 1
std.algorithm makeIndex operator ~ may cause GC allocation;

using closure causes GC allocation 1 2

std.algorithm popBack 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm popFront 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm predSwitch 'new' causes GC allocation 1 2
std.algorithm reduce.reduceImpl 'new' causes GC allocation 1 This is a throw when empty range and no seed.
std.algorithm rndstuff 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.algorithm splitter.front 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.algorithm splitter.popFront 'new' causes GC allocation 1 If version(assert) is defined this will throw a new RangeError for an empty range.
std.array Appender.this 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.array array operator ~= may cause GC allocation 1
std.array arrayAllocImpl 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5

std.array assocArray indexing an associative array may cause GC allocation 1
std.array ensureAddable 'new' causes GC allocation;

operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4

std.array insertInPlace.putDChar setting 'length' may cause GC allocation 1
std.array insertInPlace.trustedMemcopy setting 'length' may cause GC allocation 1
std.array replace 'new' causes GC allocation 1
std.array replaceInPlace operator ~ may cause GC allocation 1
std.array replaceSlice 'new' causes GC allocation 1
std.array replicate 'new' causes GC allocation 1
std.array split operator ~= may cause GC allocation 1 2
std.base64 Base64Impl.Decoder.doDecoding operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2

std.base64 Base64Impl.Decoder.popFront 'new' causes GC allocation 1 2 3 4
std.base64 Base64Impl.Decoder.popFront.endCondition 'new' causes GC allocation 1
std.base64 Base64Impl.Encoder.doEncoding setting 'length' may cause GC allocation 1
std.base64 Base64Impl.Encoder.popFront 'new' causes GC allocation 1 2
std.base64 Base64Impl.decode 'new' causes GC allocation 1 2
std.base64 Base64Impl.decodeChar 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3

std.base64 Base64Impl.encode 'new' causes GC allocation 1
std.base64 Base64Impl.realDecodeLength 'new' causes GC allocation 1
std.bigint checkDivByZero 'new' causes GC allocation 1
std.bigint toDecimalString operator ~= may cause GC allocation 1
std.bigint toHex operator ~= may cause GC allocation 1
std.bigint toString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.bitmanip length setting 'length' may cause GC allocation 1
std.bitmanip myToString operator ~ may cause GC allocation 1
std.bitmanip myToStringx operator ~ may cause GC allocation 1
std.bitmanip toString 'new' causes GC allocation;

operator ~ may cause GC allocation; using closure causes GC allocation 1 2 3

CL2
std.complex Complex.toString operator ~= may cause GC allocation;

using closure causes GC allocation 1 2 3

CL3
std.concurrency List.put 'new' causes GC allocation 1
std.concurrency MessageBox.get.onLinkDeadMsg 'new' causes GC allocation 1 2
std.concurrency MessageBox.get.pty 'new' causes GC allocation 1
std.concurrency MessageBox.this 'new' causes GC allocation 1 2 3
std.concurrency _spawn 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3

std.concurrency onCrowdingThrow 'new' causes GC allocation 1
std.concurrency receiveOnly 'new' causes GC allocation 1
std.concurrency register indexing an associative array may cause GC allocation;

operator ~= may cause GC allocation 1 2 3

std.concurrency this 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL4
std.concurrency thisTid 'new' causes GC allocation 1
std.container.array back 'new' causes GC allocation 1 2
std.container.array front 'new' causes GC allocation 1 2
std.container.array moveAt 'new' causes GC allocation 1
std.container.array moveBack 'new' causes GC allocation 1
std.container.array moveFront 'new' causes GC allocation 1
std.container.array opIndex 'new' causes GC allocation 1 2
std.container.array opSlice 'new' causes GC allocation 1 2
std.container.array opSliceAssign 'new' causes GC allocation 1 2
std.container.array opSliceOpAssign 'new' causes GC allocation 1 2
std.container.array opSliceUnary 'new' causes GC allocation 1 2
std.container.array popBack 'new' causes GC allocation 1
std.container.array popFront 'new' causes GC allocation 1
std.container.dlist DList.createNode 'new' causes GC allocation 1
std.container.dlist DList.initialize 'new' causes GC allocation 1
std.container.rbtree RBNode.dup 'new' causes GC allocation 1
std.container.rbtree RedBlackTree.allocate 'new' causes GC allocation 1
std.container.rbtree RedBlackTree.check.recurse 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

std.container.rbtree RedBlackTree.dup 'new' causes GC allocation 1
std.container.rbtree redBlackTree 'new' causes GC allocation 1 2 3 4
std.container.slist SList.initialize 'new' causes GC allocation 1
std.container.slist SList.insertFront 'new' causes GC allocation 1 2
std.container.util make.make 'new' causes GC allocation 1
std.conv convError 'new' causes GC allocation 1 2
std.conv parse 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

std.conv parse.bailOut 'new' causes GC allocation 1
std.conv parseError 'new' causes GC allocation 1
std.conv parseEscape operator ~ may cause GC allocation 1
std.conv strippedOctalLiteral operator ~= may cause GC allocation 1
std.conv textImpl operator ~= may cause GC allocation 1
std.conv toImpl 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

std.cstream seek 'new' causes GC allocation 1
std.cstream this 'new' causes GC allocation 1 2 3
std.csv CsvReader.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation; operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8 9

std.csv csvNextToken 'new' causes GC allocation 1 2 3
std.csv popFront 'new' causes GC allocation 1 2
std.csv prime 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5

std.csv toString operator ~ may cause GC allocation 1
std.datetime Clock.currStdTime 'new' causes GC allocation 1
std.datetime DosFileTimeToSysTime 'new' causes GC allocation 1 2
std.datetime Interval._enforceNotEmpty 'new' causes GC allocation 1 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the line number would not be in the correct spot, since it's essentially like enforce. A better approach would be to get rid of the function and then pre-allocate an exception for each place it was being called, but that would be pre-allocating several exceptions, since many of Interval's functions call it.
std.datetime Interval.begin 'new' causes GC allocation 1 Throws a DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime Interval.end 'new' causes GC allocation 1 Throws a DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime Interval.expand 'new' causes GC allocation 1 2 3 4 5 6 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime Interval.intersection 'new' causes GC allocation 1 2 3 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the error message wouldn't contain the bad input and would therefore be less informative.
std.datetime Interval.merge 'new' causes GC allocation 1 2 3 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the error message wouldn't contain the bad input and would therefore be less informative.
std.datetime Interval.shift 'new' causes GC allocation 1 2 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime Interval.this 'new' causes GC allocation 1 2 Throws a DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime IntervalRange._enforceCorrectDirection 'new' causes GC allocation 1 2
std.datetime IntervalRange._enforceNotEmpty 'new' causes GC allocation 1
std.datetime NegInfInterval.intersection 'new' causes GC allocation 1 2
std.datetime NegInfInterval.merge 'new' causes GC allocation 1
std.datetime NegInfIntervalRange._enforceCorrectDirection 'new' causes GC allocation 1
std.datetime PosInfInterval.intersection 'new' causes GC allocation 1 2
std.datetime PosInfInterval.merge 'new' causes GC allocation 1
std.datetime PosInfIntervalRange._enforceCorrectDirection 'new' causes GC allocation 1
std.datetime SysTimeToDosFileTime 'new' causes GC allocation 1 2
std.datetime _enforceValidTZFile 'new' causes GC allocation 1
std.datetime dayOfYear 'new' causes GC allocation 1 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception.
std.datetime enforceValid 'new' causes GC allocation 1 2 3 4 5
std.datetime everyDayOfWeek using closure causes GC allocation 1 CL5
std.datetime everyDuration using closure causes GC allocation 1 CL5
std.datetime expand using closure causes GC allocation 1 CL5
std.datetime fracSec 'new' causes GC allocation 1
std.datetime fracSecs 'new' causes GC allocation 1 2
std.datetime fracSecsFromISOString 'new' causes GC allocation 1 2 3
std.datetime fromISOExtString 'new' causes GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the error message wouldn't contain the bad input and would therefore be less informative.
std.datetime fromISOString 'new' causes GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the error message wouldn't contain the bad input and would therefore be less informative.
std.datetime fromSimpleString 'new' causes GC allocation 1 2 3 4 5 6 7 8 9 10 11 Throws a new DateTimeException on bad input. This could be changed to a pre-allocated exception, but then the error message wouldn't contain the bad input and would therefore be less informative.
std.datetime func using closure causes GC allocation 1 CL5
std.datetime getInstalledTZNames 'new' causes GC allocation 1 2
std.datetime getTimeZone 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

std.datetime initializeTests array literal may cause GC allocation;

associative array literal may cause GC allocation; indexing an associative array may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13

std.datetime monthFromString 'new' causes GC allocation 1
std.datetime parseRFC822DateTime 'new' causes GC allocation 1 2 3 4 5 6 7 8 9
std.datetime parseRFC822DateTime.parseTZ 'new' causes GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
std.datetime parseRFC822DateTime.stripAndCheckLen 'new' causes GC allocation 1
std.datetime readVal 'new' causes GC allocation 1
std.datetime testBadParse822 'new' causes GC allocation 1
std.datetime testParse822 'new' causes GC allocation 1
std.datetime this 'new' causes GC allocation 1 2 3
std.datetime toISOExtString operator ~ may cause GC allocation 1 2
std.datetime toISOString operator ~ may cause GC allocation 1 2
std.datetime toSimpleString operator ~ may cause GC allocation 1 2
std.datetime yearBC 'new' causes GC allocation 1 2
std.digest.digest toHexString 'new' causes GC allocation 1 string toHexString(ubyte[] data): Provide ouput range and/or RCString overload
std.encoding **** operator ~= may cause GC allocation 1
std.encoding EncodingScheme.create 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.encoding EncodingScheme.register 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation 1 2 3

std.encoding EncodingScheme.sanitize 'new' causes GC allocation 1
std.encoding makeReadable operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
std.encoding names array literal may cause GC allocation 1 2 3 4 5 6
std.encoding sanitize 'new' causes GC allocation 1
std.encoding transcode 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.encoding transcodeReverse operator ~ may cause GC allocation 1
std.exception assertNotThrown 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.exception assertThrown 'new' causes GC allocation 1
std.exception assumeWontThrow 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.exception bailOut 'new' causes GC allocation 1 2
std.exception enforceEx.enforceEx 'new' causes GC allocation 1 2
std.exception errnoEnforce 'new' causes GC allocation 1
std.exception this operator ~ may cause GC allocation 1
std.file _ensureLStatDone operator ~ may cause GC allocation 1
std.file _ensureStatDone operator ~ may cause GC allocation 1
std.file cenforce 'new' causes GC allocation 1
std.file deleteme operator ~ may cause GC allocation 1
std.file ensureDirExists 'new' causes GC allocation 1
std.file popFront using closure causes GC allocation 1
std.file read 'delete' requires GC 1
std.file readLink 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3 4

std.file remove operator ~ may cause GC allocation 1
std.file rmdirRecurse 'new' causes GC allocation 1
std.file this 'new' causes GC allocation 1
std.format FormatSpec.fillUp 'new' causes GC allocation 1 2
std.format doFormat.formatArg.putAArray 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.format doFormat.formatArg.putreal 'new' causes GC allocation 1
std.format doFormat.getFmtChar 'new' causes GC allocation 1
std.format doFormat.getFmtInt 'new' causes GC allocation 1 2
std.format doFormat.getFmtStar 'new' causes GC allocation 1 2
std.format formatNth.gencode operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3

std.format formatRange 'new' causes GC allocation 1
std.format getNthInt 'new' causes GC allocation 1 2
std.format primitiveTypeInfo associative array literal may cause GC allocation 1
std.format singleSpec 'new' causes GC allocation 1 2 3
std.format unformatRange indexing an associative array may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.functional memoize.memoize indexing an associative array may cause GC allocation 1
std.functional partial.partial.errormsg operator ~= may cause GC allocation 1 2
std.getopt getoptImpl 'new' causes GC allocation;

operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

std.getopt handleOption operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8

std.getopt handleOption.setHash indexing an associative array may cause GC allocation 1
std.getopt splitAndGet operator ~ may cause GC allocation 1 2 3
std.internal.math.biguintcore **** array literal may cause GC allocation 1
std.internal.math.biguintcore add 'new' causes GC allocation 1
std.internal.math.biguintcore addInt 'new' causes GC allocation 1
std.internal.math.biguintcore biguintFromDecimal 'new' causes GC allocation 1
std.internal.math.biguintcore biguintToDecimal setting 'length' may cause GC allocation 1
std.internal.math.biguintcore blockDivMod 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore div 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore divInt 'new' causes GC allocation 1
std.internal.math.biguintcore divModInternal 'delete' requires GC;

'new' causes GC allocation 1 2 3 4

std.internal.math.biguintcore fromDecimalString 'new' causes GC allocation;

array literal may cause GC allocation; setting 'length' may cause GC allocation 1 2 3

std.internal.math.biguintcore fromHexString 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore includeSign 'new' causes GC allocation 1
std.internal.math.biguintcore mod 'new' causes GC allocation;

array literal may cause GC allocation 1 2 3

std.internal.math.biguintcore modInt 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore mul 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore mulInternal 'delete' requires GC;

'new' causes GC allocation 1 2 3 4

std.internal.math.biguintcore opAssign array literal may cause GC allocation 1 2 3 4 5 6
std.internal.math.biguintcore opShl 'new' causes GC allocation 1
std.internal.math.biguintcore pow 'new' causes GC allocation;

array literal may cause GC allocation 1 2 3

std.internal.math.biguintcore squareInternal 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore sub 'new' causes GC allocation 1 2
std.internal.math.biguintcore subInt 'new' causes GC allocation 1
std.internal.math.biguintcore toDecimalString 'new' causes GC allocation 1
std.internal.math.biguintcore toHexString 'new' causes GC allocation 1
std.json assign 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2

std.json opBinary operator ~= may cause GC allocation 1
std.json opIndex operator ~ may cause GC allocation 1
std.json opIndexAssign indexing an associative array may cause GC allocation 1
std.json opOpAssign operator ~= may cause GC allocation 1
std.json parseJSON.error 'new' causes GC allocation 1
std.json parseJSON.parseValue indexing an associative array may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.json toJSON.toString 'new' causes GC allocation 1
std.json toJSON.toValue.emit indexing an associative array may cause GC allocation 1
std.mmfile this operator ~ may cause GC allocation 1 2 3
std.net.curl **** using closure causes GC allocation 1 CL1
std.net.curl AsyncLineInputRange.this 'new' causes GC allocation 1
std.net.curl Pool.push 'new' causes GC allocation 1
std.net.curl WorkerThreadProtocol.wait using closure causes GC allocation 1 CL3
std.net.curl _basicFTP operator ~= may cause GC allocation 1
std.net.curl _basicHTTP indexing an associative array may cause GC allocation;

operator ~= may cause GC allocation; using closure causes GC allocation 1 2 3 4 5

CL1
std.net.curl _finalizeAsyncChunks setting 'length' may cause GC allocation;

using closure causes GC allocation 1 2

CL3
std.net.curl _getForRange using closure causes GC allocation 1 CL3
std.net.curl _receiveAsyncLines operator ~= may cause GC allocation;

setting 'length' may cause GC allocation; using closure causes GC allocation 1 2 3

CL3
std.net.curl _spawnAsync 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.net.curl byLine.popFront array literal may cause GC allocation 1 2
std.net.curl clearIfSupported using closure causes GC allocation 1 CL5
std.net.curl decodeLineInto operator ~= may cause GC allocation;

setting 'length' may cause GC allocation; using closure causes GC allocation 1 2 3 4 5

CL5
std.net.curl decodeString operator ~= may cause GC allocation 1
std.net.curl del operator ~ may cause GC allocation;

using closure causes GC allocation 1 2

CL1
std.net.curl download 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL1
std.net.curl dup using closure causes GC allocation 1 CL5
std.net.curl onReceive using closure causes GC allocation 1 CL5
std.net.curl onReceiveHeader indexing an associative array may cause GC allocation;

using closure causes GC allocation 1 2

CL5
std.net.curl onSeek using closure causes GC allocation 1 CL5
std.net.curl onSend using closure causes GC allocation 1 CL5
std.net.curl onSocketOption using closure causes GC allocation 1 CL5
std.net.curl push using closure causes GC allocation 1 CL5
std.net.curl this 'new' causes GC allocation 1
std.net.curl upload 'new' causes GC allocation 1
std.net.curl url operator ~ may cause GC allocation 1 2
std.net.isemail isEmail 'new' causes GC allocation;

array literal may cause GC allocation; associative array literal may cause GC allocation; indexing an associative array may cause GC allocation; operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

std.net.isemail substr using closure causes GC allocation 1 CL2
std.numeric Fft.this 'new' causes GC allocation 1
std.outbuffer **** setting 'length' may cause GC allocation 1
std.parallelism RoundRobinBuffer.this setting 'length' may cause GC allocation 1 2
std.parallelism Task.executeInNewThread 'new' causes GC allocation 1 2
std.parallelism TaskPool.abstractPutGroupNoSync 'new' causes GC allocation 1
std.parallelism TaskPool.popNoSync 'new' causes GC allocation 1
std.parallelism TaskPool.this 'new' causes GC allocation 1 2 3 4 5 6 7
std.parallelism asyncBuf.AsyncBuf.this setting 'length' may cause GC allocation 1 2
std.parallelism foreachErr 'new' causes GC allocation 1
std.parallelism initialize 'new' causes GC allocation 1
std.parallelism map.map.Map.dumpToFrom setting 'length' may cause GC allocation 1
std.parallelism map.map.Map.this setting 'length' may cause GC allocation 1 2 3
std.parallelism parallel using closure causes GC allocation 1 CL4
std.parallelism popFront 'new' causes GC allocation;

using closure causes GC allocation 1 2 3

CL4
std.parallelism reduce.reduce.reduceOnRange 'new' causes GC allocation 1
std.parallelism submitAndExecute 'new' causes GC allocation 1
std.parallelism task 'new' causes GC allocation 1 2 3
std.parallelism taskPool 'new' causes GC allocation 1
std.path absolutePath 'new' causes GC allocation 1
std.path buildNormalizedPath 'new' causes GC allocation 1 2
std.path buildPath 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.path defaultExtension operator ~ may cause GC allocation 1 2
std.path expandTilde.combineCPathWithDPath operator ~= may cause GC allocation 1
std.path expandTilde.expandFromDatabase operator ~ may cause GC allocation 1 2
std.path globMatch operator ~ may cause GC allocation 1
std.path relativePath 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5

std.path setExtension operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.process Pid.performWait 'new' causes GC allocation 1
std.process _spawnvp 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.process charAllocator 'new' causes GC allocation 1
std.process createEnv 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.process environment.opIndex operator ~ may cause GC allocation 1
std.process environment.opIndexAssign operator ~ may cause GC allocation 1
std.process environment.toAA indexing an associative array may cause GC allocation 1
std.process escapeShellArguments.allocator 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.process escapeWindowsShellCommand 'new' causes GC allocation 1 2
std.process execvpe_ operator ~ may cause GC allocation 1
std.process newFromErrno 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.process pipe 'new' causes GC allocation 1 2 3
std.process pipeProcessImpl 'new' causes GC allocation 1 2
std.process shell operator ~= may cause GC allocation 1
std.process spawnProcessImpl 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5 6 7

std.process stderr 'new' causes GC allocation 1
std.process stdin 'new' causes GC allocation 1
std.process stdout 'new' causes GC allocation 1
std.process this operator ~ may cause GC allocation 1 2
std.process uniqueTempPath operator ~ may cause GC allocation 1
std.random MersenneTwisterEngine.seed 'new' causes GC allocation 1
std.random RandomCover.this setting 'length' may cause GC allocation 1 2
std.random uniformDistribution setting 'length' may cause GC allocation 1
std.range InputRangeObject.save 'new' causes GC allocation 1
std.range OnlyResult.opIndex 'new' causes GC allocation 1 2 3
std.range OnlyResult.opSlice 'new' causes GC allocation 1 2 3
std.range Zip.tryGetInit 'new' causes GC allocation 1
std.range inputRangeObject 'new' causes GC allocation 1
std.range lockstepMixin operator ~= may cause GC allocation 1 2 3 4 5 6
std.range opSlice 'new' causes GC allocation 1
std.range outputRangeObject.outputRangeObject 'new' causes GC allocation 1
std.range popBackN 'new' causes GC allocation 1 2 3
std.range put array literal may cause GC allocation 1
std.range putChar array literal may cause GC allocation 1
std.range putMethods operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4

std.range roundRobin.front.makeSwitch operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

std.range roundRobin.popFront.makeSwitchIncrementCounter operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

std.range roundRobin.popFront.makeSwitchPopFront operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

std.regex.internal.backtracking ctAtomCode operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
std.regex.internal.backtracking ctGenAlternation operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5

std.regex.internal.backtracking ctGenBlock operator ~= may cause GC allocation 1
std.regex.internal.backtracking ctGenFixupCode operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9
std.regex.internal.backtracking ctGenGroup operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3

std.regex.internal.backtracking ctGenRegEx operator ~= may cause GC allocation 1 2 3 4
std.regex.internal.backtracking ctSub operator ~ may cause GC allocation 1
std.regex.internal.backtracking restoreCode operator ~= may cause GC allocation 1 2 3 4 5
std.regex.internal.backtracking saveCode operator ~= may cause GC allocation 1 2 3 4 5
std.regex.internal.ir disassemble operator ~ may cause GC allocation 1 2
std.regex.internal.ir getTrie indexing an associative array may cause GC allocation 1
std.regex.internal.kickstart ShiftOr.fetch setting 'length' may cause GC allocation 1
std.regex.internal.kickstart ShiftOr.this 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.regex.internal.parser caseEnclose operator ~= may cause GC allocation 1
std.regex.internal.parser charsetToIr operator ~= may cause GC allocation 1 2 3
std.regex.internal.parser error 'new' causes GC allocation 1
std.regex.internal.parser getTrie indexing an associative array may cause GC allocation 1
std.regex.internal.parser lightPostprocess 'new' causes GC allocation 1 2
std.regex.internal.parser markBackref setting 'length' may cause GC allocation 1
std.regex.internal.parser parseFlags 'new' causes GC allocation 1 2
std.regex.internal.parser parseQuantifier operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.regex.internal.parser parseRegex operator ~= may cause GC allocation 1 2
std.regex.internal.parser parseUniHex 'new' causes GC allocation 1
std.regex.internal.parser put operator ~= may cause GC allocation 1
std.regex.internal.parser putRaw operator ~= may cause GC allocation 1
std.regex.internal.parser reverseBytecode 'new' causes GC allocation 1
std.regex.package Captures.newMatches 'new' causes GC allocation 1
std.socket Address.toHostString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.socket Address.toServiceString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.socket Address.toString operator ~ may cause GC allocation 1 2
std.socket InternetHost.populate 'new' causes GC allocation 1 2
std.socket InternetHost.validHostent 'new' causes GC allocation 1
std.socket Protocol.populate 'new' causes GC allocation 1
std.socket Service.populate 'new' causes GC allocation 1
std.socket Socket.accept 'new' causes GC allocation 1
std.socket Socket.accepting 'new' causes GC allocation 1
std.socket Socket.bind 'new' causes GC allocation 1
std.socket Socket.blocking 'new' causes GC allocation 1
std.socket Socket.connect 'new' causes GC allocation 1
std.socket Socket.createAddress 'new' causes GC allocation 1 2 3
std.socket Socket.getOption 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3

std.socket Socket.hostName 'new' causes GC allocation 1
std.socket Socket.listen 'new' causes GC allocation 1
std.socket Socket.localAddress 'new' causes GC allocation 1 2
std.socket Socket.remoteAddress 'new' causes GC allocation 1 2
std.socket Socket.select 'new' causes GC allocation 1
std.socket Socket.setOption 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.socket Socket.this 'new' causes GC allocation 1 2
std.socket SocketSet.add setting 'length' may cause GC allocation 1 2
std.socket SocketSet.resize setting 'length' may cause GC allocation 1
std.socket SocketSet.setMinCapacity setting 'length' may cause GC allocation 1
std.socket getAddress 'new' causes GC allocation;

operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5

std.socket getAddressInfoImpl 'new' causes GC allocation 1 2 3
std.socket parse 'new' causes GC allocation 1
std.socket parseAddress 'new' causes GC allocation 1 2
std.socket serviceToPort 'new' causes GC allocation 1
std.socket socketPair 'new' causes GC allocation 1
std.socket socketPair.toSocket 'new' causes GC allocation 1
std.socket this 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.socket toHostNameString 'new' causes GC allocation 1
std.socketstream seek 'new' causes GC allocation 1
std.stdio close operator ~ may cause GC allocation 1 2
std.stdio front 'new' causes GC allocation 1 2
std.stdio lock operator ~ may cause GC allocation 1
std.stdio opApply 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stdio opApplyRaw 'new' causes GC allocation;

operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3

std.stdio opCall 'new' causes GC allocation 1 2
std.stdio openNetwork 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.stdio popFront 'new' causes GC allocation 1 2
std.stdio popen operator ~ may cause GC allocation 1
std.stdio readln operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4

std.stdio readlnImpl operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4

std.stdio seek operator ~ may cause GC allocation 1
std.stdio setvbuf operator ~ may cause GC allocation 1 2
std.stdio tell operator ~ may cause GC allocation 1
std.stdio this 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.stdio tryLock operator ~ may cause GC allocation 1
std.stdio unlock operator ~ may cause GC allocation 1
std.stream Stream.assertReadable 'new' causes GC allocation 1
std.stream Stream.assertSeekable 'new' causes GC allocation 1
std.stream Stream.assertWriteable 'new' causes GC allocation 1
std.stream Stream.flush setting 'length' may cause GC allocation 1
std.stream Stream.getc setting 'length' may cause GC allocation 1
std.stream Stream.getcw 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.readExact 'new' causes GC allocation 1
std.stream Stream.readLine operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.readLineW operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.readString 'new' causes GC allocation 1
std.stream Stream.readStringW 'new' causes GC allocation 1
std.stream Stream.toString 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.ungetc operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.ungetcw operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.vreadf operator ~= may cause GC allocation 1 2
std.stream Stream.writeExact 'new' causes GC allocation 1
std.stream TreadLine.readLine operator ~= may cause GC allocation 1
std.stream available 'new' causes GC allocation 1
std.stream close 'delete' requires GC 1
std.stream data 'new' causes GC allocation 1
std.stream flush 'new' causes GC allocation 1
std.stream getcw 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream open 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.stream readStringW 'new' causes GC allocation 1
std.stream reserve setting 'length' may cause GC allocation 1
std.stream seek 'new' causes GC allocation 1
std.stream this 'new' causes GC allocation 1 2 3
std.string **** 'new' causes GC allocation 1
std.string abbrev indexing an associative array may cause GC allocation 1 2
std.string center 'new' causes GC allocation 1 2
std.string detab setting 'length' may cause GC allocation 1 2 3
std.string entab setting 'length' may cause GC allocation 1 2
std.string entab.change setting 'length' may cause GC allocation 1 2
std.string format 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL6
std.string isNumeric 'new' causes GC allocation 1
std.string leftJustify 'new' causes GC allocation 1 2
std.string makeTrans 'new' causes GC allocation 1
std.string outdent 'new' causes GC allocation 1
std.string rightJustify 'new' causes GC allocation 1 2
std.string sformat 'new' causes GC allocation 1
std.string succ 'new' causes GC allocation 1
std.string translate 'new' causes GC allocation 1
std.string translateImpl indexing an associative array may cause GC allocation 1
std.string wrap operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11

std.syserror SysError.msg 'new' causes GC allocation 1
std.traits demangleFunctionAttributes associative array literal may cause GC allocation;

indexing an associative array may cause GC allocation 1 2

std.traits extractAttribFlags operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
std.traits fqnType.parametersTypeString array literal may cause GC allocation;

operator ~= may cause GC allocation 1 2 3

std.traits fun associative array literal may cause GC allocation 1
std.typecons MemberFunctionGenerator.enumerateParameters array literal may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

std.typecons MemberFunctionGenerator.generateCode operator ~= may cause GC allocation 1 2
std.typecons MemberFunctionGenerator.generateCodeForOverloadSet operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

std.typecons MemberFunctionGenerator.generateFunction operator ~= may cause GC allocation 1
std.typecons MemberFunctionGenerator.generateFunction.make_postAtts operator ~= may cause GC allocation 1 2 3 4 5
std.typecons MemberFunctionGenerator.generateFunction.make_returnType operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

std.typecons MemberFunctionGenerator.generateFunction.make_storageClass operator ~= may cause GC allocation 1 2 3 4
std.typecons MemberFunctionGenerator.generateParameters array literal may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

std.typecons Tuple.injectNamedFields operator ~= may cause GC allocation 1 2
std.typecons Unique.this 'delete' requires GC 1
std.typecons alignForSize operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13

std.typecons generateDoNothing operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8

std.typecons this operator ~ may cause GC allocation 1
std.typecons wrap.wrap.Impl.generateFun.mod operator ~= may cause GC allocation 1 2 3
std.typecons wrap.wrap.Impl.generateFun.stc operator ~= may cause GC allocation 1 2 3 4 5 6
std.typecons wrap.wrap.wrap 'new' causes GC allocation 1
std.uni InversionList.this operator ~= may cause GC allocation 1 2
std.uni MultiArray.this 'new' causes GC allocation 1
std.uni SetSearcher.opCall 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.uni Utf16Matcher.badEncoding 'new' causes GC allocation 1
std.uni Utf8Matcher.DefMatcher.genDispatch operator ~= may cause GC allocation 1 2 3
std.uni Utf8Matcher.badEncoding 'new' causes GC allocation 1
std.uni alloc 'new' causes GC allocation 1
std.uni append operator ~= may cause GC allocation 1
std.uni compressTo operator ~= may cause GC allocation 1 2 3 4 5 6
std.uni dropUpTo array literal may cause GC allocation 1
std.uni encodeTo 'new' causes GC allocation 1
std.uni genUnrolledSwitchSearch operator ~= may cause GC allocation 1 2 3
std.uni inverted array literal may cause GC allocation 1 2
std.uni isPrettyPropertyName array literal may cause GC allocation 1
std.uni length.length setting 'length' may cause GC allocation 1 2
std.uni loadAny 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.uni normalize operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5

std.uni realloc setting 'length' may cause GC allocation 1
std.uni skipUpTo array literal may cause GC allocation 1
std.uni testAll using closure causes GC allocation 1 CL5
std.uni toCaseInPlaceAlloc.toCaseInPlaceAlloc 'new' causes GC allocation 1
std.uni toSourceCode.bisect operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.uni toSourceCode.linearScope operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7

std.uni toSourceCode.switchScope operator ~= may cause GC allocation 1 2
std.uri URI_Decode 'new' causes GC allocation 1 2 3 4 5 6 7 8 9 10 11
std.uri URI_Encode 'new' causes GC allocation 1 2 3 4 5
std.uri this operator ~ may cause GC allocation 1
std.utf decodeImpl 'new' causes GC allocation 1 2
std.utf decodeImpl.exception 'new' causes GC allocation 1 2 3
std.utf decodeImpl.invalidUTF 'new' causes GC allocation 1
std.utf decodeImpl.outOfBounds 'new' causes GC allocation 1
std.utf encode 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14

std.utf strideBack 'new' causes GC allocation 1 2
std.utf strideImpl 'new' causes GC allocation 1
std.utf testBadDecode 'new' causes GC allocation 1 2
std.utf testDecode 'new' causes GC allocation 1 2 3
std.utf testDecodeFront 'new' causes GC allocation 1 2 3
std.utf this operator ~ may cause GC allocation 1
std.utf toString operator ~= may cause GC allocation 1 2 3
std.utf toUCSindex 'new' causes GC allocation 1 2
std.utf toUTF16 operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5

std.utf toUTF32 setting 'length' may cause GC allocation 1 2
std.utf toUTF8 setting 'length' may cause GC allocation 1 2 3 4
std.utf toUTFzImpl array literal may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.utf zeroLen 'new' causes GC allocation 1 2 3
std.uuid parseUUID.parserError 'new' causes GC allocation 1 2 3 throws Exception
std.uuid this 'new' causes GC allocation 1 2 3 4 5 throws Exception
std.variant VariantN.get 'new' causes GC allocation 1 2
std.variant VariantN.handler 'new' causes GC allocation 1
std.variant VariantN.handler.tryPutting 'new' causes GC allocation;

array literal may cause GC allocation; indexing an associative array may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

std.variant VariantN.opArithmetic 'new' causes GC allocation 1
std.variant VariantN.opAssign 'new' causes GC allocation 1
std.variant VariantN.opCmp 'new' causes GC allocation 1
std.variant this operator ~ may cause GC allocation 1
std.variant variantArray operator ~= may cause GC allocation 1
std.variant visitImpl.visitGetOverloadMap 'new' causes GC allocation 1
std.xml Check.fail 'new' causes GC allocation 1 2 3
std.xml ElementParser.parse 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11

std.xml Item.pretty array literal may cause GC allocation 1
std.xml Tag.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8 9 10

std.xml appendItem operator ~= may cause GC allocation 1
std.xml assertNot 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL6
std.xml check 'new' causes GC allocation 1
std.xml checkAttValue operator ~ may cause GC allocation 1
std.xml checkElement operator ~ may cause GC allocation 1
std.xml checkEnd 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.xml checkLiteral operator ~ may cause GC allocation 1
std.xml decode 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11

std.xml exit 'new' causes GC allocation 1
std.xml opCatAssign operator ~= may cause GC allocation 1 2 3 4 5
std.xml parse 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6

std.xml pretty array literal may cause GC allocation;

operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7

std.xml reqc 'new' causes GC allocation 1
std.xml startOf operator ~= may cause GC allocation 1 2
std.xml text 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2

std.xml this 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13

std.xml toNonEndString operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.xml toString operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8

std.xml toType 'new' causes GC allocation 1
std.zip ArchiveMember.compressionMethod 'new' causes GC allocation 1
std.zip ArchiveMember.expandedData setting 'length' may cause GC allocation 1
std.zip ZipArchive.addMember indexing an associative array may cause GC allocation 1
std.zip ZipArchive.build 'new' causes GC allocation 1 2 3
std.zip ZipArchive.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6 7 8 9

std.zip expand 'new' causes GC allocation 1 2 3 4
std.zip this operator ~ may cause GC allocation 1
std.zlib Compress.error 'new' causes GC allocation 1
std.zlib UnCompress.error 'new' causes GC allocation 1
std.zlib compress 'delete' requires GC;

'new' causes GC allocation; operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8

std.zlib flush 'delete' requires GC;

operator ~= may cause GC allocation 1 2 3

std.zlib uncompress 'delete' requires GC;

'new' causes GC allocation; operator ~ may cause GC allocation; operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13