@@ -159,10 +159,13 @@ template<typename E> class OptionSet {
159159 StorageType m_storage { 0 };
160160};
161161
162+ int atoi (const char * str);
163+
162164class Number {
163165public:
164166 Number (int v) : v(v) { }
165167 Number (double );
168+ Number (const char * str) : v(atoi(str)) { }
166169 Number operator +(const Number&);
167170 Number& operator ++() { ++v; return *this ; }
168171 Number operator ++(int ) { Number returnValue (v); ++v; return returnValue; }
@@ -173,9 +176,16 @@ class Number {
173176 int v;
174177};
175178
179+ class DerivedNumber : public Number {
180+ public:
181+ DerivedNumber (char c) : Number(c - ' 0' ) { }
182+ DerivedNumber (const char * str) : Number(atoi(str)) { }
183+ };
184+
176185class ComplexNumber {
177186public:
178187 ComplexNumber () : realPart(0 ), complexPart(0 ) { }
188+ ComplexNumber (int real, const char * str) : realPart(real), complexPart(str) { }
179189 ComplexNumber (const ComplexNumber&);
180190 ComplexNumber& operator ++() { realPart.someMethod (); return *this ; }
181191 ComplexNumber operator ++(int );
@@ -311,6 +321,7 @@ class RefCounted {
311321 return ;
312322 }
313323 unsigned trivial60 () { return ObjectWithNonTrivialDestructor { 5 }.value (); }
324+ unsigned trivial61 () { return DerivedNumber (' 7' ).value (); }
314325
315326 static RefCounted& singleton () {
316327 static RefCounted s_RefCounted;
@@ -391,6 +402,9 @@ class RefCounted {
391402 ComplexNumber nonTrivial18 () { return +complex ; }
392403 ComplexNumber* nonTrivial19 () { return new ComplexNumber (complex ); }
393404 unsigned nonTrivial20 () { return ObjectWithMutatingDestructor { 7 }.value (); }
405+ unsigned nonTrivial21 () { return Number (" 123" ).value (); }
406+ unsigned nonTrivial22 () { return ComplexNumber (123 , " 456" ).real ().value (); }
407+ unsigned nonTrivial23 () { return DerivedNumber (" 123" ).value (); }
394408
395409 static unsigned s_v;
396410 unsigned v { 0 };
@@ -479,6 +493,7 @@ class UnrelatedClass {
479493 getFieldTrivial ().trivial58 (); // no-warning
480494 getFieldTrivial ().trivial59 (); // no-warning
481495 getFieldTrivial ().trivial60 (); // no-warning
496+ getFieldTrivial ().trivial61 (); // no-warning
482497
483498 RefCounted::singleton ().trivial18 (); // no-warning
484499 RefCounted::singleton ().someFunction (); // no-warning
@@ -525,6 +540,12 @@ class UnrelatedClass {
525540 // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
526541 getFieldTrivial ().nonTrivial20 ();
527542 // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
543+ getFieldTrivial ().nonTrivial21 ();
544+ // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
545+ getFieldTrivial ().nonTrivial22 ();
546+ // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
547+ getFieldTrivial ().nonTrivial23 ();
548+ // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
528549 }
529550};
530551
0 commit comments