[cxx-abi-dev] Scope encoding of string literals in default arguments questions

scott douglass sdouglass at arm.com
Mon Nov 11 10:18:50 UTC 2002


Mark Mitchell wrote:
> 
> 
> --On Friday, November 01, 2002 11:47:59 AM +0000 scott douglass 
> <sdouglass at arm.com> wrote:
> 
>> Hi,
>>
>> I have some questions about the scope encoding of string literals in
>> inline functions.  Consider,
>>
>>   bool g(const char*);
>>
>>   inline const char* f1(const char* p = "world");  // _ZZ2f1Es ?
>>
>>   inline const char* f1(const char* p) {
>>     g(p);
>>     g("hello");  // _ZZ2f1Es_0 ?
>>     g("world");  // _ZZ2f1Es ?
>>   }
> 
> 
> I think that the only consistent thing to do is to move the default
> argument into the callers; that is where it will be emitted.

But, doesn't the expression 'f1()' have to supply the same pointer for 'p' even in different translation units?  As far as I can tell the standard doesn't address this directly.

>> I'll also suggest some minor clarifications to the wording in 5.1.6:
>>   "Note that this assumes that the same string literal occurring twice in
>> a given function in fact represents a single entity, i.e. has a unique
>> address."
>>
>> would be better as
>>   "Note that this means that the same string literal occurring twice in a
>> given inline function in fact represents a single entity, i.e. has a
>> unique address.  It also means that string literals in inline functions
>> do not "tail-share", i.e. the string literals "abc" and "bc" are
>> completely distinct in inline functions."
> 
> 
> Why?

I think I see what you mean.  As long as the compiler counts the orignial string literals:

  void h(const char *);

  inline void k() {
    h("bc"); // _ZZ1kEs
    h("abc"); // _ZZ1kEs_0
  }

A compiler could make the references to '_ZZ1kEs_0 + 1' and '_ZZ1kEs_0'.  It doesn't even need to emit '_ZZ1kEs' because anyone referring to '_ZZ1kEs' will also emit it.





More information about the cxx-abi-dev mailing list