More tweaks to the compatibility page.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124792 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/www/compatibility.html b/www/compatibility.html
index ca15531..aa6a39d 100644
--- a/www/compatibility.html
+++ b/www/compatibility.html
@@ -65,7 +65,7 @@
<li><a href="#implicit-downcasts">Implicit downcasts</a></li>
</ul>
<ul>
- <li><a href="#Use of class as method name">Use of class as method name</a></li>
+ <li><a href="#class-as-property-name">Using <code>class</code> as a property name</a></li>
</ul>
</li>
</ul>
@@ -418,8 +418,8 @@
<ul>
<li>The element type of a variable length array must be a POD
("plain old data") type, which means that it cannot have any
- user-declared constructors or destructors, base classes, or any
- members if non-POD type. All C types are POD types.</li>
+ user-declared constructors or destructors, any base classes, or any
+ members of non-POD type. All C types are POD types.</li>
<li>Variable length arrays cannot be used as the type of a non-type
template parameter.</li> </ul>
@@ -428,12 +428,9 @@
<ol>
<li>replace the variable length array with a fixed-size array if you can
- determine a
- reasonable upper bound at compile time; sometimes this is as
+ determine a reasonable upper bound at compile time; sometimes this is as
simple as changing <tt>int size = ...;</tt> to <tt>const int size
- = ...;</tt> (if the definition of <tt>size</tt> is a compile-time
- integral constant);</li>
-<li>use <tt>std::string</tt> instead of a <tt>char []</tt>;</li>
+ = ...;</tt> (if the initializer is a compile-time constant);</li>
<li>use <tt>std::vector</tt> or some other suitable container type;
or</li>
<li>allocate the array on the heap instead using <tt>new Type[]</tt> -
@@ -762,18 +759,18 @@
<!-- ======================================================================= -->
<p>Due to a bug in its implementation, GCC allows implicit downcasts
-(from base class to a derived class) when calling functions. Such code is
-inherently unsafe, since the object might not actually be an instance
-of the derived class, and is rejected by Clang. For example, given
-this code:</p>
+of Objective-C pointers (from a base class to a derived class) when
+calling functions. Such code is inherently unsafe, since the object
+might not actually be an instance of the derived class, and is
+rejected by Clang. For example, given this code:</p>
<pre>
@interface Base @end
@interface Derived : Base @end
-void f(Derived *);
-void g(Base *base) {
- f(base);
+void f(Derived *p);
+void g(Base *p) {
+ f(p);
}
</pre>
@@ -781,11 +778,11 @@
<pre>
downcast.mm:6:3: error: no matching function for call to 'f'
- f(base);
+ f(p);
^
downcast.mm:4:6: note: candidate function not viable: cannot convert from
superclass 'Base *' to subclass 'Derived *' for 1st argument
-void f(Derived *);
+void f(Derived *p);
^
</pre>
@@ -798,13 +795,17 @@
</pre>
<!-- ======================================================================= -->
-<h3 id="Use of class as method name">Use of class as method name</h3>
+<h3 id="class-as-property-name">Using <code>class</code> as a property name</h3>
<!-- ======================================================================= -->
-<p>Use of 'class' name to declare a method is allowed in objective-c++ mode to
-be compatible with GCC. However, use of property dot syntax notation to call
-this method is not allowed in clang++, as [I class] is a suitable syntax that
-will work. So, this test will fail in clang++.
+<p>In C and Objective-C, <code>class</code> is a normal identifier and
+can be used to name fields, ivars, methods, and so on. In
+C++, <code>class</code> is a keyword. For compatibility with existing
+code, Clang permits <code>class</code> to be used as part of a method
+selector in Objective-C++, but this does not extend to any other part
+of the language. In particular, it is impossible to use property dot
+syntax in Objective-C++ with the property name <code>class</code>, so
+the following code will fail to parse:</p>
<pre>
@interface I {
@@ -818,6 +819,7 @@
@end
<pre>
+<p>Use explicit message-send syntax instead, i.e. <code>[I class]</code>.</p>
</div>
</body>