Topic: Allow attributes on template explicit instantiations


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Tue, 23 Aug 2016 15:21:13 -0400
Raw View
Consider the following code which exports an explicit instantiation of a
template (e.g. imagine this is in a .cpp file of a library):

  template <typename T> T foo(T*)
  {
    // ...
  }
  template FOO_EXPORT int foo<int>(int*);

Modern C++ allows FOO_EXPORT on ELF platforms using GCC and Clang to be
defined as `[[gnu::visibility("default")]]`... right?

Alas, no. Attributes on explicit instantiations are explicitly forbidden
([dcl.attr.grammar]/5). (Despite that, GCC is happy to DTRT here. Clang,
however, enforces the standard, even though this particular prohibition
- especially for the attribute in this example - seems to be of
questionable value.)

This is obviously unfortunate. Is there any reason for this restriction
to be in place? If not, I propose to remove it.

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/npi7n9%24ccj%241%40blaine.gmane.org.

.


Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Fri, 26 Aug 2016 10:32:02 -0400
Raw View
This is a multi-part message in MIME format.
--------------030901000002000307080307
Content-Type: text/plain; charset=UTF-8

On 2016-08-23 15:21, Matthew Woehlke wrote:
> Consider the following code which exports an explicit instantiation of a
> template (e.g. imagine this is in a .cpp file of a library):
>
>   template <typename T> T foo(T*)
>   {
>     // ...
>   }
>   template FOO_EXPORT int foo<int>(int*);
>
> Modern C++ allows FOO_EXPORT on ELF platforms using GCC and Clang to be
> defined as `[[gnu::visibility("default")]]`... right?
>
> Alas, no. Attributes on explicit instantiations are explicitly forbidden
> ([dcl.attr.grammar]/5). (Despite that, GCC is happy to DTRT here. Clang,
> however, enforces the standard, even though this particular prohibition
> - especially for the attribute in this example - seems to be of
> questionable value.)
>
> This is obviously unfortunate. Is there any reason for this restriction
> to be in place? If not, I propose to remove it.

That exciting, huh?

Well, here's a paper. Comments appreciated!

--
Matthew

--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/57C052E2.8020704%40gmail.com.

--------------030901000002000307080307
Content-Type: text/html; charset=UTF-8;
 name="dxxxx-instantiation-attributes.html"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="dxxxx-instantiation-attributes.html"

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjwhRE9DVFlQRSBodG1s
IFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRw
Oi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4K
PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJl
biIgbGFuZz0iZW4iPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBj
b250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CjxtZXRhIG5hbWU9ImdlbmVy
YXRvciIgY29udGVudD0iRG9jdXRpbHMgMC4xMjogaHR0cDovL2RvY3V0aWxzLnNvdXJjZWZv
cmdlLm5ldC8iIC8+Cjx0aXRsZT5BbGxvdyBBdHRyaWJ1dGVzIG9uIFRlbXBsYXRlIEV4cGxp
Y2l0IEluc3RhbnRpYXRpb25zPC90aXRsZT4KPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0i
MjAxNi0wOC0yMyIgLz4KPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJNYXR0aGV3IFdv
ZWhsa2UgKG13b2VobGtlLmZsb3NzJiM2NDtnbWFpbC5jb20pIiAvPgo8c3R5bGUgdHlwZT0i
dGV4dC9jc3MiPgoKLyoKOkF1dGhvcjogRGF2aWQgR29vZGdlciAoZ29vZGdlckBweXRob24u
b3JnKQo6SWQ6ICRJZDogaHRtbDRjc3MxLmNzcyA3NjE0IDIwMTMtMDItMjEgMTU6NTU6NTFa
IG1pbGRlICQKOkNvcHlyaWdodDogVGhpcyBzdHlsZXNoZWV0IGhhcyBiZWVuIHBsYWNlZCBp
biB0aGUgcHVibGljIGRvbWFpbi4KCkRlZmF1bHQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IGZv
ciB0aGUgSFRNTCBvdXRwdXQgb2YgRG9jdXRpbHMuCgpTZWUgaHR0cDovL2RvY3V0aWxzLnNm
Lm5ldC9kb2NzL2hvd3RvL2h0bWwtc3R5bGVzaGVldHMuaHRtbCBmb3IgaG93IHRvCmN1c3Rv
bWl6ZSB0aGlzIHN0eWxlIHNoZWV0LgoqLwoKLyogdXNlZCB0byByZW1vdmUgYm9yZGVycyBm
cm9tIHRhYmxlcyBhbmQgaW1hZ2VzICovCi5ib3JkZXJsZXNzLCB0YWJsZS5ib3JkZXJsZXNz
IHRkLCB0YWJsZS5ib3JkZXJsZXNzIHRoIHsKICBib3JkZXI6IDAgfQoKdGFibGUuYm9yZGVy
bGVzcyB0ZCwgdGFibGUuYm9yZGVybGVzcyB0aCB7CiAgLyogT3ZlcnJpZGUgcGFkZGluZyBm
b3IgInRhYmxlLmRvY3V0aWxzIHRkIiB3aXRoICIhIGltcG9ydGFudCIuCiAgICAgVGhlIHJp
Z2h0IHBhZGRpbmcgc2VwYXJhdGVzIHRoZSB0YWJsZSBjZWxscy4gKi8KICBwYWRkaW5nOiAw
IDAuNWVtIDAgMCAhIGltcG9ydGFudCB9CgouZmlyc3QgewogIC8qIE92ZXJyaWRlIG1vcmUg
c3BlY2lmaWMgbWFyZ2luIHN0eWxlcyB3aXRoICIhIGltcG9ydGFudCIuICovCiAgbWFyZ2lu
LXRvcDogMCAhIGltcG9ydGFudCB9CgoubGFzdCwgLndpdGgtc3VidGl0bGUgewogIG1hcmdp
bi1ib3R0b206IDAgISBpbXBvcnRhbnQgfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSB9
CgphLnRvYy1iYWNrcmVmIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgOwogIGNvbG9yOiBi
bGFjayB9CgpibG9ja3F1b3RlLmVwaWdyYXBoIHsKICBtYXJnaW46IDJlbSA1ZW0gOyB9Cgpk
bC5kb2N1dGlscyBkZCB7CiAgbWFyZ2luLWJvdHRvbTogMC41ZW0gfQoKb2JqZWN0W3R5cGU9
ImltYWdlL3N2Zyt4bWwiXSwgb2JqZWN0W3R5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZl
LWZsYXNoIl0gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIFVuY29tbWVudCAoYW5kIHJl
bW92ZSB0aGlzIHRleHQhKSB0byBnZXQgYm9sZC1mYWNlZCBkZWZpbml0aW9uIGxpc3QgdGVy
bXMKZGwuZG9jdXRpbHMgZHQgewogIGZvbnQtd2VpZ2h0OiBib2xkIH0KKi8KCmRpdi5hYnN0
cmFjdCB7CiAgbWFyZ2luOiAyZW0gNWVtIH0KCmRpdi5hYnN0cmFjdCBwLnRvcGljLXRpdGxl
IHsKICBmb250LXdlaWdodDogYm9sZCA7CiAgdGV4dC1hbGlnbjogY2VudGVyIH0KCmRpdi5h
ZG1vbml0aW9uLCBkaXYuYXR0ZW50aW9uLCBkaXYuY2F1dGlvbiwgZGl2LmRhbmdlciwgZGl2
LmVycm9yLApkaXYuaGludCwgZGl2LmltcG9ydGFudCwgZGl2Lm5vdGUsIGRpdi50aXAsIGRp
di53YXJuaW5nIHsKICBtYXJnaW46IDJlbSA7CiAgYm9yZGVyOiBtZWRpdW0gb3V0c2V0IDsK
ICBwYWRkaW5nOiAxZW0gfQoKZGl2LmFkbW9uaXRpb24gcC5hZG1vbml0aW9uLXRpdGxlLCBk
aXYuaGludCBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi5pbXBvcnRhbnQgcC5hZG1vbml0aW9u
LXRpdGxlLCBkaXYubm90ZSBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi50aXAgcC5hZG1vbml0
aW9uLXRpdGxlIHsKICBmb250LXdlaWdodDogYm9sZCA7CiAgZm9udC1mYW1pbHk6IHNhbnMt
c2VyaWYgfQoKZGl2LmF0dGVudGlvbiBwLmFkbW9uaXRpb24tdGl0bGUsIGRpdi5jYXV0aW9u
IHAuYWRtb25pdGlvbi10aXRsZSwKZGl2LmRhbmdlciBwLmFkbW9uaXRpb24tdGl0bGUsIGRp
di5lcnJvciBwLmFkbW9uaXRpb24tdGl0bGUsCmRpdi53YXJuaW5nIHAuYWRtb25pdGlvbi10
aXRsZSwgLmNvZGUgLmVycm9yIHsKICBjb2xvcjogcmVkIDsKICBmb250LXdlaWdodDogYm9s
ZCA7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQoKLyogVW5jb21tZW50IChhbmQgcmVt
b3ZlIHRoaXMgdGV4dCEpIHRvIGdldCByZWR1Y2VkIHZlcnRpY2FsIHNwYWNlIGluCiAgIGNv
bXBvdW5kIHBhcmFncmFwaHMuCmRpdi5jb21wb3VuZCAuY29tcG91bmQtZmlyc3QsIGRpdi5j
b21wb3VuZCAuY29tcG91bmQtbWlkZGxlIHsKICBtYXJnaW4tYm90dG9tOiAwLjVlbSB9Cgpk
aXYuY29tcG91bmQgLmNvbXBvdW5kLWxhc3QsIGRpdi5jb21wb3VuZCAuY29tcG91bmQtbWlk
ZGxlIHsKICBtYXJnaW4tdG9wOiAwLjVlbSB9CiovCgpkaXYuZGVkaWNhdGlvbiB7CiAgbWFy
Z2luOiAyZW0gNWVtIDsKICB0ZXh0LWFsaWduOiBjZW50ZXIgOwogIGZvbnQtc3R5bGU6IGl0
YWxpYyB9CgpkaXYuZGVkaWNhdGlvbiBwLnRvcGljLXRpdGxlIHsKICBmb250LXdlaWdodDog
Ym9sZCA7CiAgZm9udC1zdHlsZTogbm9ybWFsIH0KCmRpdi5maWd1cmUgewogIG1hcmdpbi1s
ZWZ0OiAyZW0gOwogIG1hcmdpbi1yaWdodDogMmVtIH0KCmRpdi5mb290ZXIsIGRpdi5oZWFk
ZXIgewogIGNsZWFyOiBib3RoOwogIGZvbnQtc2l6ZTogc21hbGxlciB9CgpkaXYubGluZS1i
bG9jayB7CiAgZGlzcGxheTogYmxvY2sgOwogIG1hcmdpbi10b3A6IDFlbSA7CiAgbWFyZ2lu
LWJvdHRvbTogMWVtIH0KCmRpdi5saW5lLWJsb2NrIGRpdi5saW5lLWJsb2NrIHsKICBtYXJn
aW4tdG9wOiAwIDsKICBtYXJnaW4tYm90dG9tOiAwIDsKICBtYXJnaW4tbGVmdDogMS41ZW0g
fQoKZGl2LnNpZGViYXIgewogIG1hcmdpbjogMCAwIDAuNWVtIDFlbSA7CiAgYm9yZGVyOiBt
ZWRpdW0gb3V0c2V0IDsKICBwYWRkaW5nOiAxZW0gOwogIGJhY2tncm91bmQtY29sb3I6ICNm
ZmZmZWUgOwogIHdpZHRoOiA0MCUgOwogIGZsb2F0OiByaWdodCA7CiAgY2xlYXI6IHJpZ2h0
IH0KCmRpdi5zaWRlYmFyIHAucnVicmljIHsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiA7
CiAgZm9udC1zaXplOiBtZWRpdW0gfQoKZGl2LnN5c3RlbS1tZXNzYWdlcyB7CiAgbWFyZ2lu
OiA1ZW0gfQoKZGl2LnN5c3RlbS1tZXNzYWdlcyBoMSB7CiAgY29sb3I6IHJlZCB9CgpkaXYu
c3lzdGVtLW1lc3NhZ2UgewogIGJvcmRlcjogbWVkaXVtIG91dHNldCA7CiAgcGFkZGluZzog
MWVtIH0KCmRpdi5zeXN0ZW0tbWVzc2FnZSBwLnN5c3RlbS1tZXNzYWdlLXRpdGxlIHsKICBj
b2xvcjogcmVkIDsKICBmb250LXdlaWdodDogYm9sZCB9CgpkaXYudG9waWMgewogIG1hcmdp
bjogMmVtIH0KCmgxLnNlY3Rpb24tc3VidGl0bGUsIGgyLnNlY3Rpb24tc3VidGl0bGUsIGgz
LnNlY3Rpb24tc3VidGl0bGUsCmg0LnNlY3Rpb24tc3VidGl0bGUsIGg1LnNlY3Rpb24tc3Vi
dGl0bGUsIGg2LnNlY3Rpb24tc3VidGl0bGUgewogIG1hcmdpbi10b3A6IDAuNGVtIH0KCmgx
LnRpdGxlIHsKICB0ZXh0LWFsaWduOiBjZW50ZXIgfQoKaDIuc3VidGl0bGUgewogIHRleHQt
YWxpZ246IGNlbnRlciB9Cgpoci5kb2N1dGlscyB7CiAgd2lkdGg6IDc1JSB9CgppbWcuYWxp
Z24tbGVmdCwgLmZpZ3VyZS5hbGlnbi1sZWZ0LCBvYmplY3QuYWxpZ24tbGVmdCB7CiAgY2xl
YXI6IGxlZnQgOwogIGZsb2F0OiBsZWZ0IDsKICBtYXJnaW4tcmlnaHQ6IDFlbSB9CgppbWcu
YWxpZ24tcmlnaHQsIC5maWd1cmUuYWxpZ24tcmlnaHQsIG9iamVjdC5hbGlnbi1yaWdodCB7
CiAgY2xlYXI6IHJpZ2h0IDsKICBmbG9hdDogcmlnaHQgOwogIG1hcmdpbi1sZWZ0OiAxZW0g
fQoKaW1nLmFsaWduLWNlbnRlciwgLmZpZ3VyZS5hbGlnbi1jZW50ZXIsIG9iamVjdC5hbGln
bi1jZW50ZXIgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1h
cmdpbi1yaWdodDogYXV0bzsKfQoKLmFsaWduLWxlZnQgewogIHRleHQtYWxpZ246IGxlZnQg
fQoKLmFsaWduLWNlbnRlciB7CiAgY2xlYXI6IGJvdGggOwogIHRleHQtYWxpZ246IGNlbnRl
ciB9CgouYWxpZ24tcmlnaHQgewogIHRleHQtYWxpZ246IHJpZ2h0IH0KCi8qIHJlc2V0IGlu
bmVyIGFsaWdubWVudCBpbiBmaWd1cmVzICovCmRpdi5hbGlnbi1yaWdodCB7CiAgdGV4dC1h
bGlnbjogaW5oZXJpdCB9CgovKiBkaXYuYWxpZ24tY2VudGVyICogeyAqLwovKiAgIHRleHQt
YWxpZ246IGxlZnQgfSAqLwoKb2wuc2ltcGxlLCB1bC5zaW1wbGUgewogIG1hcmdpbi1ib3R0
b206IDFlbSB9CgpvbC5hcmFiaWMgewogIGxpc3Qtc3R5bGU6IGRlY2ltYWwgfQoKb2wubG93
ZXJhbHBoYSB7CiAgbGlzdC1zdHlsZTogbG93ZXItYWxwaGEgfQoKb2wudXBwZXJhbHBoYSB7
CiAgbGlzdC1zdHlsZTogdXBwZXItYWxwaGEgfQoKb2wubG93ZXJyb21hbiB7CiAgbGlzdC1z
dHlsZTogbG93ZXItcm9tYW4gfQoKb2wudXBwZXJyb21hbiB7CiAgbGlzdC1zdHlsZTogdXBw
ZXItcm9tYW4gfQoKcC5hdHRyaWJ1dGlvbiB7CiAgdGV4dC1hbGlnbjogcmlnaHQgOwogIG1h
cmdpbi1sZWZ0OiA1MCUgfQoKcC5jYXB0aW9uIHsKICBmb250LXN0eWxlOiBpdGFsaWMgfQoK
cC5jcmVkaXRzIHsKICBmb250LXN0eWxlOiBpdGFsaWMgOwogIGZvbnQtc2l6ZTogc21hbGxl
ciB9CgpwLmxhYmVsIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwIH0KCnAucnVicmljIHsKICBm
b250LXdlaWdodDogYm9sZCA7CiAgZm9udC1zaXplOiBsYXJnZXIgOwogIGNvbG9yOiBtYXJv
b24gOwogIHRleHQtYWxpZ246IGNlbnRlciB9CgpwLnNpZGViYXItdGl0bGUgewogIGZvbnQt
ZmFtaWx5OiBzYW5zLXNlcmlmIDsKICBmb250LXdlaWdodDogYm9sZCA7CiAgZm9udC1zaXpl
OiBsYXJnZXIgfQoKcC5zaWRlYmFyLXN1YnRpdGxlIHsKICBmb250LWZhbWlseTogc2Fucy1z
ZXJpZiA7CiAgZm9udC13ZWlnaHQ6IGJvbGQgfQoKcC50b3BpYy10aXRsZSB7CiAgZm9udC13
ZWlnaHQ6IGJvbGQgfQoKcHJlLmFkZHJlc3MgewogIG1hcmdpbi1ib3R0b206IDAgOwogIG1h
cmdpbi10b3A6IDAgOwogIGZvbnQ6IGluaGVyaXQgfQoKcHJlLmxpdGVyYWwtYmxvY2ssIHBy
ZS5kb2N0ZXN0LWJsb2NrLCBwcmUubWF0aCwgcHJlLmNvZGUgewogIG1hcmdpbi1sZWZ0OiAy
ZW0gOwogIG1hcmdpbi1yaWdodDogMmVtIH0KCnByZS5jb2RlIC5sbiB7IGNvbG9yOiBncmV5
OyB9IC8qIGxpbmUgbnVtYmVycyAqLwpwcmUuY29kZSwgY29kZSB7IGJhY2tncm91bmQtY29s
b3I6ICNlZWVlZWUgfQpwcmUuY29kZSAuY29tbWVudCwgY29kZSAuY29tbWVudCB7IGNvbG9y
OiAjNUM2NTc2IH0KcHJlLmNvZGUgLmtleXdvcmQsIGNvZGUgLmtleXdvcmQgeyBjb2xvcjog
IzNCMEQwNjsgZm9udC13ZWlnaHQ6IGJvbGQgfQpwcmUuY29kZSAubGl0ZXJhbC5zdHJpbmcs
IGNvZGUgLmxpdGVyYWwuc3RyaW5nIHsgY29sb3I6ICMwQzU0MDQgfQpwcmUuY29kZSAubmFt
ZS5idWlsdGluLCBjb2RlIC5uYW1lLmJ1aWx0aW4geyBjb2xvcjogIzM1MkI4NCB9CnByZS5j
b2RlIC5kZWxldGVkLCBjb2RlIC5kZWxldGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI0RFQjBB
MX0KcHJlLmNvZGUgLmluc2VydGVkLCBjb2RlIC5pbnNlcnRlZCB7IGJhY2tncm91bmQtY29s
b3I6ICNBM0QyODl9CgpzcGFuLmNsYXNzaWZpZXIgewogIGZvbnQtZmFtaWx5OiBzYW5zLXNl
cmlmIDsKICBmb250LXN0eWxlOiBvYmxpcXVlIH0KCnNwYW4uY2xhc3NpZmllci1kZWxpbWl0
ZXIgewogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIDsKICBmb250LXdlaWdodDogYm9sZCB9
CgpzcGFuLmludGVycHJldGVkIHsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiB9CgpzcGFu
Lm9wdGlvbiB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcCB9CgpzcGFuLnByZSB7CiAgd2hpdGUt
c3BhY2U6IHByZSB9CgpzcGFuLnByb2JsZW1hdGljIHsKICBjb2xvcjogcmVkIH0KCnNwYW4u
c2VjdGlvbi1zdWJ0aXRsZSB7CiAgLyogZm9udC1zaXplIHJlbGF0aXZlIHRvIHBhcmVudCAo
aDEuLmg2IGVsZW1lbnQpICovCiAgZm9udC1zaXplOiA4MCUgfQoKdGFibGUuY2l0YXRpb24g
ewogIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggZ3JheTsKICBtYXJnaW4tbGVmdDogMXB4IH0K
CnRhYmxlLmRvY2luZm8gewogIG1hcmdpbjogMmVtIDRlbSB9Cgp0YWJsZS5kb2N1dGlscyB7
CiAgbWFyZ2luLXRvcDogMC41ZW0gOwogIG1hcmdpbi1ib3R0b206IDAuNWVtIH0KCnRhYmxl
LmZvb3Rub3RlIHsKICBib3JkZXItbGVmdDogc29saWQgMXB4IGJsYWNrOwogIG1hcmdpbi1s
ZWZ0OiAxcHggfQoKdGFibGUuZG9jdXRpbHMgdGQsIHRhYmxlLmRvY3V0aWxzIHRoLAp0YWJs
ZS5kb2NpbmZvIHRkLCB0YWJsZS5kb2NpbmZvIHRoIHsKICBwYWRkaW5nLWxlZnQ6IDAuNWVt
IDsKICBwYWRkaW5nLXJpZ2h0OiAwLjVlbSA7CiAgdmVydGljYWwtYWxpZ246IHRvcCB9Cgp0
YWJsZS5kb2N1dGlscyB0aC5maWVsZC1uYW1lLCB0YWJsZS5kb2NpbmZvIHRoLmRvY2luZm8t
bmFtZSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQgOwogIHRleHQtYWxpZ246IGxlZnQgOwogIHdo
aXRlLXNwYWNlOiBub3dyYXAgOwogIHBhZGRpbmctbGVmdDogMCB9CgovKiAiYm9va3RhYnMi
IHN0eWxlIChubyB2ZXJ0aWNhbCBsaW5lcykgKi8KdGFibGUuZG9jdXRpbHMuYm9va3RhYnMg
ewogIGJvcmRlcjogMHB4OwogIGJvcmRlci10b3A6IDJweCBzb2xpZDsKICBib3JkZXItYm90
dG9tOiAycHggc29saWQ7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKfQp0YWJsZS5k
b2N1dGlscy5ib29rdGFicyAqIHsKICBib3JkZXI6IDBweDsKfQp0YWJsZS5kb2N1dGlscy5i
b29rdGFicyB0aCB7CiAgYm9yZGVyLWJvdHRvbTogdGhpbiBzb2xpZDsKICB0ZXh0LWFsaWdu
OiBsZWZ0Owp9CgpoMSB0dC5kb2N1dGlscywgaDIgdHQuZG9jdXRpbHMsIGgzIHR0LmRvY3V0
aWxzLApoNCB0dC5kb2N1dGlscywgaDUgdHQuZG9jdXRpbHMsIGg2IHR0LmRvY3V0aWxzIHsK
ICBmb250LXNpemU6IDEwMCUgfQoKdWwuYXV0by10b2MgewogIGxpc3Qtc3R5bGUtdHlwZTog
bm9uZSB9Cgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGNsYXNzPSJkb2N1bWVudCIg
aWQ9ImFsbG93LWF0dHJpYnV0ZXMtb24tdGVtcGxhdGUtZXhwbGljaXQtaW5zdGFudGlhdGlv
bnMiPgo8aDEgY2xhc3M9InRpdGxlIj5BbGxvdyBBdHRyaWJ1dGVzIG9uIFRlbXBsYXRlIEV4
cGxpY2l0IEluc3RhbnRpYXRpb25zPC9oMT4KPHRhYmxlIGNsYXNzPSJkb2NpbmZvIiBmcmFt
ZT0idm9pZCIgcnVsZXM9Im5vbmUiPgo8Y29sIGNsYXNzPSJkb2NpbmZvLW5hbWUiIC8+Cjxj
b2wgY2xhc3M9ImRvY2luZm8tY29udGVudCIgLz4KPHRib2R5IHZhbGlnbj0idG9wIj4KPHRy
IGNsYXNzPSJmaWVsZCI+PHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkRvY3VtZW50OjwvdGg+
PHRkIGNsYXNzPSJmaWVsZC1ib2R5Ij5EeHh4eDwvdGQ+CjwvdHI+Cjx0cj48dGggY2xhc3M9
ImRvY2luZm8tbmFtZSI+RGF0ZTo8L3RoPgo8dGQ+MjAxNi0wOC0yMzwvdGQ+PC90cj4KPHRy
IGNsYXNzPSJmaWVsZCI+PHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPlByb2plY3Q6PC90aD48
dGQgY2xhc3M9ImZpZWxkLWJvZHkiPklTTy9JRUMgSlRDMSBTQzIyIFdHMjEgUHJvZ3JhbW1p
bmcgTGFuZ3VhZ2UgQysrPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJmaWVsZCI+PHRoIGNsYXNz
PSJkb2NpbmZvLW5hbWUiPkF1ZGllbmNlOjwvdGg+PHRkIGNsYXNzPSJmaWVsZC1ib2R5Ij5F
dm9sdXRpb24gV29ya2luZyBHcm91cDwvdGQ+CjwvdHI+Cjx0cj48dGggY2xhc3M9ImRvY2lu
Zm8tbmFtZSI+QXV0aG9yOjwvdGg+Cjx0ZD5NYXR0aGV3IFdvZWhsa2UgKDxhIGNsYXNzPSJy
ZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Im1haWx0bzptd29laGxrZS5mbG9zcyYjNjQ7Z21h
aWwuY29tIj5td29laGxrZS5mbG9zcyYjNjQ7Z21haWwuY29tPC9hPik8L3RkPjwvdHI+Cjwv
dGJvZHk+CjwvdGFibGU+CjxzdHlsZT4KICBodG1sIHsgY29sb3I6IGJsYWNrOyBiYWNrZ3Jv
dW5kOiB3aGl0ZTsgfQogIHRhYmxlLmRvY2luZm8geyBtYXJnaW46IDJlbSAwOyB9CiAgLmxp
dGVyYWwtYmxvY2sgeyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBzb2xpZCAjZGRk
OyBwYWRkaW5nOiAwLjVlbTsgfQogIC5hZGRpdGlvbiB7IGNvbG9yOiAjMmMyOyB0ZXh0LWRl
Y29yYXRpb246IHVuZGVybGluZTsgfQogIC5yZW1vdmFsIHsgY29sb3I6ICNlMjI7IHRleHQt
ZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyB9CiAgLmxpdGVyYWwtYmxvY2sgLmxpdGVyYWwt
YmxvY2sgeyBiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IH0KICAuYmxvY2stYWRk
aXRpb24geyBiYWNrZ3JvdW5kOiAjY2ZjOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsg
fQo8L3N0eWxlPjxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJhYnN0cmFjdCI+CjxoMT48YSBj
bGFzcz0idG9jLWJhY2tyZWYiIGhyZWY9IiNpZDEiPkFic3RyYWN0PC9hPjwvaDE+CjxwPlRo
aXMgcHJvcG9zYWwgcmVjb21tZW5kcyB0byByZW1vdmUgdGhlIHByb2hpYml0aW9uIGFnYWlu
c3QgYXR0cmlidXRlcyBvbiBhIHRlbXBsYXRlIGV4cGxpY2l0IGluc3RhbnRpYXRpb24uPC9w
Pgo8cD4oTm90ZTogcmVmZXJlbmNlcyBtYWRlIHRvIHRoZSBleGlzdGluZyBkcmFmdCBzdGFu
ZGFyZCBhcmUgbWFkZSBhZ2FpbnN0IDxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhy
ZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJz
LzIwMTYvbjQ2MDYucGRmIj5ONDYwNjwvYT4uKTwvcD4KPGRpdiBjbGFzcz0iY29udGVudHMg
dG9waWMiIGlkPSJjb250ZW50cyI+CjxwIGNsYXNzPSJ0b3BpYy10aXRsZSBmaXJzdCI+Q29u
dGVudHM8L3A+Cjx1bCBjbGFzcz0ic2ltcGxlIj4KPGxpPjxhIGNsYXNzPSJyZWZlcmVuY2Ug
aW50ZXJuYWwiIGhyZWY9IiNhYnN0cmFjdCIgaWQ9ImlkMSI+QWJzdHJhY3Q8L2E+PC9saT4K
PGxpPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9IiNwcm9ibGVtIiBpZD0i
aWQyIj5Qcm9ibGVtPC9hPjwvbGk+CjxsaT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFs
IiBocmVmPSIjcHJvcG9zYWwiIGlkPSJpZDMiPlByb3Bvc2FsPC9hPjwvbGk+CjxsaT48YSBj
bGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjcHJvcG9zZWQtd29yZGluZyIgaWQ9
ImlkNCI+UHJvcG9zZWQgV29yZGluZzwvYT48L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5j
ZSBpbnRlcm5hbCIgaHJlZj0iI2ltcGxlbWVudGF0aW9uIiBpZD0iaWQ1Ij5JbXBsZW1lbnRh
dGlvbjwvYT48L2xpPgo8bGk+PGEgY2xhc3M9InJlZmVyZW5jZSBpbnRlcm5hbCIgaHJlZj0i
I2Fja25vd2xlZGdtZW50cyIgaWQ9ImlkNiI+QWNrbm93bGVkZ21lbnRzPC9hPjwvbGk+Cjxs
aT48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSIjcmVmZXJlbmNlcyIgaWQ9
ImlkNyI+UmVmZXJlbmNlczwvYT48L2xpPgo8L3VsPgo8L2Rpdj4KPC9kaXY+CjxkaXYgY2xh
c3M9InNlY3Rpb24iIGlkPSJwcm9ibGVtIj4KPGgxPjxhIGNsYXNzPSJ0b2MtYmFja3JlZiIg
aHJlZj0iI2lkMiI+UHJvYmxlbTwvYT48L2gxPgo8cD5XaGVuIGNyZWF0aW5nIGEgQysrIGxp
YnJhcnksIGl0IGlzIHR5cGljYWxseSBuZWNlc3NhcnkgdG8gYW5ub3RhdGUgaW4gc29tZSBt
YW5uZXIgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB0
byBjb25zdW1lcnMgb2YgdGhlIGxpYnJhcnkgKGFzIG9wcG9zZWQgdG8gYmVpbmcgaW50ZXJu
YWwgdG8gdGhlIGxpYnJhcnkgaXRzZWxmKS4gT24gV2luZG93cywgdGhpcyB0YWtlcyB0aGUg
Zm9ybSBvZiA8dHQgY2xhc3M9ImRvY3V0aWxzIGxpdGVyYWwiPl9fZGVjbHNwZWMoZGxsZXhw
b3J0KTwvdHQ+LiBPbiBFTEYgcGxhdGZvcm1zLCB3aGVuIHVzaW5nIGhpZGRlbiB2aXNpYmls
aXR5LCB0aGlzIG1heSBsb29rIGxpa2UgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48
c3BhbiBjbGFzcz0icHJlIj5fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCZxdW90O2RlZmF1
bHQmcXVvdDspKSk8L3NwYW4+PC90dD4uIFNpbmNlIHRoZSBwcm9wZXIgZGVjb3JhdGlvbiBp
cyBkZXBlbmRlbnQgb24gbXVsdGlwbGUgZmFjdG9ycyDigJQgdGFyZ2V0IHBsYXRmb3JtIGJl
aW5nIHRoZSBtb3N0IG9idmlvdXMsIGJ1dCBpbiB0aGUgY2FzZSBvZiA8dHQgY2xhc3M9ImRv
Y3V0aWxzIGxpdGVyYWwiPl9fZGVjbHNwZWM8L3R0PiwgdGhlIGRlY29yYXRpb24gbXVzdCBk
aWZmZXIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgYmVpbmcgYnVpbHQg
b3IgY29uc3VtZWQg4oCUIG1vc3QgbGlicmFyaWVzIHdpbGwgZGVmaW5lIGEgcHJlcHJvY2Vz
c29yICZxdW90O2V4cG9ydCBkZWNvcmF0aW9uIHN5bWJvbCZxdW90OyB0byBzaW1wbGlmeSAn
ZGVjb3JhdGluZycgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLjwvcD4KPHA+Q29tYmluZWQg
d2l0aCB0ZW1wbGF0ZXMsIHdoZXJlIHRoZSBkZWZpbml0aW9uIG9mIGEgdGVtcGxhdGUgZnVu
Y3Rpb24gbWF5IGJlIGludGVybmFsLCBidXQgY2VydGFpbiBpbnN0YW50aWF0aW9ucyBuZWVk
IHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LCBvbmUgY2Fu
IGltYWdlIGNvZGUgbGlrZSBzbzo8L3A+CjxwcmUgY2xhc3M9ImNvZGUgYysrIGxpdGVyYWwt
YmxvY2siPgo8c3BhbiBjbGFzcz0iY29tbWVudCBzaW5nbGUiPi8vIEEgdGVtcGxhdGUgZnVu
Y3Rpb24KPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50ZW1wbGF0ZTwvc3Bhbj4gPHNw
YW4gY2xhc3M9Im9wZXJhdG9yIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50
eXBlbmFtZTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5hbWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9
Im9wZXJhdG9yIj4mZ3Q7PC9zcGFuPiA8c3BhbiBjbGFzcz0ibmFtZSI+VDwvc3Bhbj4gPHNw
YW4gY2xhc3M9Im5hbWUiPmZvbzwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPig8
L3NwYW4+PHNwYW4gY2xhc3M9Im5hbWUiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9Im9wZXJhdG9y
Ij4qPC9zcGFuPjxzcGFuIGNsYXNzPSJwdW5jdHVhdGlvbiI+KTwvc3Bhbj4KPHNwYW4gY2xh
c3M9InB1bmN0dWF0aW9uIj57PC9zcGFuPgogIDxzcGFuIGNsYXNzPSJjb21tZW50IHNpbmds
ZSI+Ly8gLi4uCjwvc3Bhbj48c3BhbiBjbGFzcz0icHVuY3R1YXRpb24iPn08L3NwYW4+Cgo8
c3BhbiBjbGFzcz0iY29tbWVudCBzaW5nbGUiPi8vIEFuIGV4cG9ydGVkIGV4cGxpY2l0IGlu
c3RhbnRpYXRpb24KPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50ZW1wbGF0ZTwvc3Bh
bj4gPHNwYW4gY2xhc3M9Im5hbWUiPkZPT19FWFBPUlQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJr
ZXl3b3JkIHR5cGUiPmludDwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5hbWUiPmZvbzwvc3Bhbj48
c3BhbiBjbGFzcz0ib3BlcmF0b3IiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQg
dHlwZSI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRvciI+Jmd0Ozwvc3Bhbj48c3Bh
biBjbGFzcz0icHVuY3R1YXRpb24iPig8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQgdHlw
ZSI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJvcGVyYXRvciI+Kjwvc3Bhbj48c3BhbiBjbGFz
cz0icHVuY3R1YXRpb24iPik7PC9zcGFuPgo8L3ByZT4KPHA+U2luY2UgYXR0cmlidXRlcyB3
ZXJlIGludHJvZHVjZWQgaW4gQysrMTEsIHRoZXJlIGhhcyBiZWVuIGFjdGl2aXR5IHRvd2Fy
ZCBzdGFuZGFyZGl6aW5nIHRoZSBtZWNoYW5pc21zIGZvciBleHBvcnQgZGVjb3JhdGlvbi4g
SW4gcGFydGljdWxhciwgR0NDIGFuZCBDbGFuZyBzdXBwb3J0IHRoZSB1c2Ugb2YgPHR0IGNs
YXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0icHJlIj5bW2dudTo6dmlzaWJp
bGl0eSgmcXVvdDtkZWZhdWx0JnF1b3Q7KV1dPC9zcGFuPjwvdHQ+IGFzIGEgcmVwbGFjZW1l
bnQgZm9yIDx0dCBjbGFzcz0iZG9jdXRpbHMgbGl0ZXJhbCI+PHNwYW4gY2xhc3M9InByZSI+
X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgmcXVvdDtkZWZhdWx0JnF1b3Q7KSkpPC9zcGFu
PjwvdHQ+LiBUaGlzIGlzIGFuIG9idmlvdXMgaW1wcm92ZW1lbnQ6IGl0IGlzIHNob3J0ZXIg
dG8gd3JpdGUsIGFuZCBjb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHRoZSBDKysx
MSBhdHRyaWJ1dGUgbWF5IGlnbm9yZSBpdCwgcmF0aGVyIHRoYW4gcmFpc2luZyBhIHN5bnRh
eCBlcnJvciBhcyB3b3VsZCBiZSB0aGUgY2FzZSBpZiB0aGUgb2xkIGZvcm0gd2VyZSB1c2Vk
IHdpdGggYSBjb21waWxlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQuPC9wPgo8cD5Bc3R1
dGUgcmVhZGVycyBtYXkgaGF2ZSBzcG90dGVkIHRoZSBwcm9ibGVtIGJ5IG5vdzogPGVtPmV4
cGxpY2l0IGluc3RhbnRpYXRpb25zIGZvcmJpZCBhdHRyaWJ1dGVzPC9lbT4gKFtkY2wuYXR0
ci5ncmFtbWFyXcK2NSkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYWJvdmUgZXhhbXBsZSBjYW5u
b3QgdXNlIGEgQysrMTEgYXR0cmlidXRlIG9uIGEgY29uZm9ybWluZyBjb21waWxlcjsgaW5k
ZWVkLCB0aGVyZSBpcyBubyB3YXkgdG8gd3JpdGUgc3RyaWN0bHkgY29uZm9ybWluZyBjb2Rl
IHRoYXQgYWxzbyBzcGVjaWZpZXMgdGhhdCB0aGUgaW5zdGFudGlhdGlvbiBzaG91bGQgYmUg
ZXhwb3J0ZWQuPC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InByb3Bvc2Fs
Ij4KPGgxPjxhIGNsYXNzPSJ0b2MtYmFja3JlZiIgaHJlZj0iI2lkMyI+UHJvcG9zYWw8L2E+
PC9oMT4KPHA+UHJlc2VudGx5LCBDKysgZm9yYmlkcyBhdHRyaWJ1dGVzIG9uIHRlbXBsYXRl
IGV4cGxpY2l0IGluc3RhbnRpYXRpb25zLiBXZSBzdXNwZWN0IHRoYXQgdGhpcyBsaW1pdGF0
aW9uIHdhcyBpbXBvc2VkIGluIHRoZSBiZWxpZWYgdGhhdCB0aGVyZSBhcmUgbm8gcmVhc29u
YWJsZSBhdHRyaWJ1dGVzIHRoYXQgbWlnaHQgYmUgYXBwbGllZCB0byBzdWNoLiBIb3dldmVy
LCBhcyB3ZSBoYXZlIHNob3duIGFib3ZlLCB0aGlzIGlzIG5vdCB0aGUgY2FzZS48L3A+Cjxw
PldlIHByb3Bvc2UgdG8gcmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24uIFRoZSBzdGFuZGFyZCBh
bHJlYWR5IGFsbG93cyB0aGF0IGFuIHVucmVhc29uYWJsZSBhdHRyaWJ1dGUgbWF5IGJlIHJl
amVjdGVkLCBzbyB0aGlzIGNoYW5nZSBieSBpdHNlbGYgZG9lcyBub3QgaW50cm9kdWNlIHRo
ZSBhYmlsaXR5IHRvIGRvIHVuZGVzaXJhYmxlIHRoaW5ncy4gSG93ZXZlciwgaXQgd291bGQg
YWRkIGZyZWVkb20gdG8gY29tcGlsZXIgdmVuZG9ycywgYnkgYWxsb3dpbmcgdGhlbSB0byBh
Y2NlcHQgcmVhc29uYWJsZSBhdHRyaWJ1dGVzIChlLmcuIHZlbmRvci1zcGVjaWZpYyBhdHRy
aWJ1dGVzIHN1Y2ggYXMgZXhwb3J0IGFubm90YXRpb24pIGFwcGxpZWQgdG8gZXhwbGljaXQg
aW5zdGFudGlhdGlvbnMuIEluIHBhcnRpY3VsYXIsIHRoaXMgY2hhbmdlIGFkZHJlc3NlcyBh
biBpc3N1ZSB3aGljaCBwcmV2ZW50cyBhdXRob3JzIGZyb20gZnVsbHkgc3dpdGNoaW5nIHRv
IEMrKzExIGF0dHJpYnV0ZXMgZm9yIGV4cG9ydCBkZWNvcmF0aW9uLjwvcD4KPHA+V2UgYmVs
aWV2ZSB0aGF0IHRoZSB1dGlsaXR5IG9mIHRoaXMgY2hhbmdlIGlzIHNlbGYgZXZpZGVudCwg
YXMgZXhlbXBsaWZpZWQgYWJvdmUsIGFuZCB0aGF0IGl0IG1hdGNoZXMgcHJvZ3JhbW1lciBl
eHBlY3RhdGlvbnMuIFdlIGFyZSBhbHNvIG5vdCBhd2FyZSBvZiBhbnkgc2VyaW91cyByZWFz
b25zIGZvciB0aGUgcmVzdHJpY3Rpb24gdG8gZXhpc3QuPC9wPgo8L2Rpdj4KPGRpdiBjbGFz
cz0ic2VjdGlvbiIgaWQ9InByb3Bvc2VkLXdvcmRpbmciPgo8aDE+PGEgY2xhc3M9InRvYy1i
YWNrcmVmIiBocmVmPSIjaWQ0Ij5Qcm9wb3NlZCBXb3JkaW5nPC9hPjwvaDE+CjxwPihQcm9w
b3NlZCBjaGFuZ2VzIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gPGEgY2xhc3M9InJlZmVy
ZW5jZSBleHRlcm5hbCIgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIy
L3dnMjEvZG9jcy9wYXBlcnMvMjAxNi9uNDYwNi5wZGYiPk40NjA2PC9hPi4pPC9wPgo8cD5J
biBbZGNsLmF0dHIuZ3JhbW1hcl3CtjUsIG1ha2UgdGhlIGZvbGxvd2luZyBjaGFuZ2U6PC9w
Pgo8ZGl2IGNsYXNzPSJsaXRlcmFsLWJsb2NrIGNvbXBvdW5kIj4KPHA+RWFjaCA8ZW0+YXR0
cmlidXRlLXNwZWNpZmllci1zZXE8L2VtPiBpcyBzYWlkIHRvIDxlbT5hcHBlcnRhaW48L2Vt
PiB0byBzb21lIGVudGl0eSBvciBzdGF0ZW1lbnQsIGlkZW50aWZpZWQgYnkgdGhlIHN5bnRh
Y3RpYyBjb250ZXh0IHdoZXJlIGl0IGFwcGVhcnMgKENsYXVzZSA2LCBDbGF1c2UgNywgQ2xh
dXNlIDgpLgpJZiBhbiA8ZW0+YXR0cmlidXRlLXNwZWNpZmllci1zZXE8L2VtPiB0aGF0IGFw
cGVydGFpbnMgdG8gc29tZSBlbnRpdHkgb3Igc3RhdGVtZW50IGNvbnRhaW5zIGFuIDxlbT5h
dHRyaWJ1dGU8L2VtPiB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGFwcGx5IHRvIHRoYXQgZW50
aXR5IG9yIHN0YXRlbWVudCwgdGhlIHByb2dyYW0gaXMgaWxsLWZvcm1lZC4KSWYgYW4gPGVt
PmF0dHJpYnV0ZS1zcGVjaWZpZXItc2VxPC9lbT4gYXBwZXJ0YWlucyB0byBhIGZyaWVuZCBk
ZWNsYXJhdGlvbiAoMTEuMyksIHRoYXQgZGVjbGFyYXRpb24gc2hhbGwgYmUgYSBkZWZpbml0
aW9uLiA8c3BhbiBjbGFzcz0icmVtb3ZhbCI+Tm8gPGVtPmF0dHJpYnV0ZS1zcGVjaWZpZXIt
c2VxPC9lbT4gc2hhbGwgYXBwZXJ0YWluIHRvIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24g
KDE0LjcuMikuPC9zcGFuPjwvcD4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9u
IiBpZD0iaW1wbGVtZW50YXRpb24iPgo8aDE+PGEgY2xhc3M9InRvYy1iYWNrcmVmIiBocmVm
PSIjaWQ1Ij5JbXBsZW1lbnRhdGlvbjwvYT48L2gxPgo8cD5BdCBsZWFzdCBHQ0MgNC44IGFu
ZCA2LjEgKGFuZCBwcmVzdW1hYmx5IGFsbCBpbnRlcnZlbmluZyB2ZXJzaW9ucykgZG8gbm90
IGltcGxlbWVudCB0aGlzIHJlc3RyaWN0aW9uIGFuZCBhbGxvdyBhdHRyaWJ1dGVzIOKAlCBh
dCBsZWFzdCB0aGUgPHR0IGNsYXNzPSJkb2N1dGlscyBsaXRlcmFsIj48c3BhbiBjbGFzcz0i
cHJlIj5nbnU6OnZpc2liaWxpdHk8L3NwYW4+PC90dD4gYXR0cmlidXRlIOKAlCB0byBiZSBh
cHBsaWVkIHRvIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zLjwvcD4KPC9kaXY+CjxkaXYgY2xh
c3M9InNlY3Rpb24iIGlkPSJhY2tub3dsZWRnbWVudHMiPgo8aDE+PGEgY2xhc3M9InRvYy1i
YWNrcmVmIiBocmVmPSIjaWQ2Ij5BY2tub3dsZWRnbWVudHM8L2E+PC9oMT4KPHA+V2Ugd2lz
aCB0byB0aGFuayBSaWNoYXJkIFNtaXRoIGZvciBwb2ludGluZyBvdXQgdGhpcyBwcm9oaWJp
dGlvbi48L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIiBpZD0icmVmZXJlbmNlcyI+
CjxoMT48YSBjbGFzcz0idG9jLWJhY2tyZWYiIGhyZWY9IiNpZDciPlJlZmVyZW5jZXM8L2E+
PC9oMT4KPHVsPgo8bGk+PHAgY2xhc3M9ImZpcnN0Ij48YSBjbGFzcz0icmVmZXJlbmNlIGV4
dGVybmFsIiBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9k
b2NzL3BhcGVycy8yMDE2L240NjA2LnBkZiI+TjQ2MDY8L2E+IFdvcmtpbmcgRHJhZnQsIFN0
YW5kYXJkIGZvciBQcm9ncmFtbWluZyBMYW5ndWFnZSBDKys8L3A+CjxwPjxhIGNsYXNzPSJy
ZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEv
c2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTYvbjQ2MDYucGRmIj5odHRwOi8vd3d3Lm9wZW4t
c3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDE2L240NjA2LnBkZjwvYT48
L3A+CjwvbGk+CjwvdWw+CjwhLS0gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4g
Li4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLi4gLS0+CjwhLS0ga2F0
ZTogaGwgcmVTdHJ1Y3R1cmVkVGV4dCAtLT4KPC9kaXY+CjwvZGl2Pgo8L2JvZHk+CjwvaHRt
bD4K
--------------030901000002000307080307
Content-Type: text/prs.fallenstein.rst;
 name="dxxxx-instantiation-attributes.rst"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="dxxxx-instantiation-attributes.rst"

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D
  Allow Attributes on Template Explicit Instantiations
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D

:Document:  Dxxxx
:Date:      2016-08-23
:Project:   ISO/IEC JTC1 SC22 WG21 Programming Language C++
:Audience:  Evolution Working Group
:Author:    Matthew Woehlke (mwoehlke.floss@gmail.com)

=2E. raw:: html

  <style>
    html { color: black; background: white; }
    table.docinfo { margin: 2em 0; }
    .literal-block { background: #eee; border: 1px solid #ddd; padding: 0=
=2E5em; }
    .addition { color: #2c2; text-decoration: underline; }
    .removal { color: #e22; text-decoration: line-through; }
    .literal-block .literal-block { background: none; border: none; }
    .block-addition { background: #cfc; text-decoration: underline; }
  </style>

=2E. role:: add
    :class: addition

=2E. role:: del
    :class: removal

Abstract
=3D=3D=3D=3D=3D=3D=3D=3D

This proposal recommends to remove the prohibition against attributes on =
a template explicit instantiation.

(Note: references made to the existing draft standard are made against N4=
606_.)

=2E. contents::


Problem
=3D=3D=3D=3D=3D=3D=3D

When creating a C++ library, it is typically necessary to annotate in som=
e manner those functions which should be made available to consumers of t=
he library (as opposed to being internal to the library itself). On Windo=
ws, this takes the form of ``__declspec(dllexport)``. On ELF platforms, w=
hen using hidden visibility, this may look like ``__attribute__((visibili=
ty("default")))``. Since the proper decoration is dependent on multiple f=
actors |--| target platform being the most obvious, but in the case of ``=
__declspec``, the decoration must differ depending on whether the library=
 is being built or consumed |--| most libraries will define a preprocesso=
r "export decoration symbol" to simplify 'decorating' functions to be exp=
orted.

Combined with templates, where the definition of a template function may =
be internal, but certain instantiations need to be made available to user=
s of the library, one can image code like so:

=2E. code:: c++

  // A template function
  template <typename T> T foo(T*)
  {
    // ...
  }

  // An exported explicit instantiation
  template FOO_EXPORT int foo<int>(int*);

Since attributes were introduced in C++11, there has been activity toward=
 standardizing the mechanisms for export decoration. In particular, GCC a=
nd Clang support the use of ``[[gnu::visibility("default")]]`` as a repla=
cement for ``__attribute__((visibility("default")))``. This is an obvious=
 improvement: it is shorter to write, and compilers that don't understand=
 the C++11 attribute may ignore it, rather than raising a syntax error as=
 would be the case if the old form were used with a compiler that does no=
t support it.

Astute readers may have spotted the problem by now: *explicit instantiati=
ons forbid attributes* ([dcl.attr.grammar]\ |para|\ 5). This means that t=
he above example cannot use a C++11 attribute on a conforming compiler; i=
ndeed, there is no way to write strictly conforming code that also specif=
ies that the instantiation should be exported.


Proposal
=3D=3D=3D=3D=3D=3D=3D=3D

Presently, C++ forbids attributes on template explicit instantiations. We=
 suspect that this limitation was imposed in the belief that there are no=
 reasonable attributes that might be applied to such. However, as we have=
 shown above, this is not the case.

We propose to remove this restriction. The standard already allows that a=
n unreasonable attribute may be rejected, so this change by itself does n=
ot introduce the ability to do undesirable things. However, it would add =
freedom to compiler vendors, by allowing them to accept reasonable attrib=
utes (e.g. vendor-specific attributes such as export annotation) applied =
to explicit instantiations. In particular, this change addresses an issue=
 which prevents authors from fully switching to C++11 attributes for expo=
rt decoration.

We believe that the utility of this change is self evident, as exemplifie=
d above, and that it matches programmer expectations. We are also not awa=
re of any serious reasons for the restriction to exist.


Proposed Wording
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

(Proposed changes are specified relative to N4606_.)

In [dcl.attr.grammar]\ |para|\ 5, make the following change:

=2E. compound::
  :class: literal-block

  Each *attribute-specifier-seq* is said to *appertain* to some entity or=
 statement, identified by the syntactic context where it appears (Clause =
6, Clause 7, Clause 8).
  If an *attribute-specifier-seq* that appertains to some entity or state=
ment contains an *attribute* that is not allowed to apply to that entity =
or statement, the program is ill-formed.
  If an *attribute-specifier-seq* appertains to a friend declaration (11.=
3), that declaration shall be a definition. :del:`No *attribute-specifier=
-seq* shall appertain to an explicit instantiation (14.7.2).`


Implementation
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

At least GCC 4.8 and 6.1 (and presumably all intervening versions) do not=
 implement this restriction and allow attributes |--| at least the ``gnu:=
:visibility`` attribute |--| to be applied to explicit instantiations.


Acknowledgments
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

We wish to thank Richard Smith for pointing out this prohibition.


References
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

=2E. _N4606: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n460=
6.pdf

* N4606_ Working Draft, Standard for Programming Language C++

  http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

=2E. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..=
 .. ..

=2E. |--| unicode:: U+02014 .. em dash
=2E. |para| unicode:: U+00B6 .. paragraph sign

=2E. kate: hl reStructuredText

--------------030901000002000307080307--

.