[PATCH] D19131: Lit C++11 Compatibility Patch #8
Charles Li via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 14 14:19:18 PDT 2016
tigerleapgorge created this revision.
tigerleapgorge added a reviewer: rsmith.
tigerleapgorge added a subscriber: cfe-commits.
24 tests have been updated for C++11 compatibility.
CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp
Ambiguous class member lookup has been fixed in C++11
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1111
Restrict the following diagnostics to C++98.
C++98: warning: lookup of 'set' in member access expression is ambiguous; using member of 'Value'
note: lookup in the object type 'Value' refers here
note: lookup from the current scope refers here
CXX/class/class.friend/p1.cpp
Restrict the following diagnostics to C++98.
C++98 error: friends cannot be members of the declaring class
CXX/class/class.friend/p2.cpp
Restrict the following 2 diagnostics to C++98.
C++98: warning: non-class friend type 'int' is a C++11 extension
C++98: warning: unelaborated friend declaration is a C++11 extension; specify 'struct' to befriend 'B0'
CXX/stmt.stmt/stmt.dcl/p3.cpp
Definition of POD has been relaxed in C++11 such that a struct with
a trivial copy assignment operator is still considered POD.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2294.html
In the above paper, the following clause has been crossed out.
“and has no user-declared copy assignment operator and no user-declared destructor”
For this test, struct Z is still a POD struct in C++11.
Therefore goto can jump over Z’s instantiation without causing a compiler Error.
Restrict the following to C++98
C++98: error: cannot jump from this goto statement to its label
C++98: note: jump bypasses initialization of non-POD variable
CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
C++11 accepts arbitrary literal types for non-type template parameters
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3413.html
Change in diagnostics.
C++98: error: non-type template argument for template parameter of pointer type 'int *' must have its address taken
C++11: error: non-type template argument of type 'int' is not a constant expression
note: read of non-const variable 'i' is not allowed in a constant expression
note: declared here
Restrict the following to C++98
C++98: warning: non-type template argument referring to object 'ki' with internal linkage is a C++11 extension
Note: non-type template argument refers to object here
Change in diagnostics.
C++98: error: non-type template argument refers to thread-local object
note: non-type template argument refers here
C++11: error: non-type template argument of type 'int *' is not a constant expression
note: template parameter is declared here
Restrict the following to C++98
C++98: non-type template argument referring to function 'f_internal' with internal linkage is a C++11 extension
note: non-type template argument refers to function here
Change in diagnostics
C++98: error: non-type template argument refers to object 'n' that does not have linkage
note: non-type template argument refers to object here
C++11: error: non-type template argument of type 'int *' is not a constant expression
note: pointer to 'n' is not a constant expression
note: declared here
note: template parameter is declared here
Change in diagnostics
C++98: error: non-type template argument for template parameter of pointer type 'int *' must have its address taken
C++11: error: non-type template argument of type 'int *' is not a constant expression
note: read of non-constexpr variable 'iptr' is not allowed in a constant expression
note: declared here
CXX/temp/temp.arg/temp.arg.type/p2.cpp
Unnamed types can now be used as template arguments in C++11
http://stackoverflow.com/questions/5131691/what-is-an-unnamed-type-in-c
Restrict the following diagnostics to C++98.
C++98: Warning: template argument uses unnamed type
CXX/temp/temp.fct.spec/temp.deduct/p9.cpp
Template argument constant expression narrowing is not allowed.
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1809
Restrict the following diagnostics to C++98.
C++98: error: call to 'f' is ambiguous
note: candidate function
note: candidate function
CXX/temp/temp.spec/no-body.cpp
Explicit instantiation of a template inside a nested namespace is an Error in C++11.
This could be the result of the following defect fix.
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#995
Added 3 instances of the following diagnostics.
C++11: error: explicit instantiation of 'x' must occur at global scope
note: explicit instantiation refers here
Also remove these 3 explicit instantiations from the -fixit runs.
CodeGenCXX/const-init.cpp
Use constexpr instead of const in C++11 so the compiler does not complain.
C++98: static const double d = 1.0;
C++11: static constexpr double d = 1.0;
Parser/cxx-class.cpp
Change in diagnostics for malformed class member definitions without parenthesis.
In C++11, this looks like malformed initializer lists.
C++98: error: function definition does not declare parameters
C++11: error: expected expression
error: expected '}'
note: to match this '{'
error: expected ';' after class
error: extraneous closing brace
C++98: error: function definition does not declare parameters
C++11: error: variable has incomplete type 'void'
error: expected ';' after top level declarator
Restrict 6 instances of the following to C++98
C++98: in-class initialization of non-static data member is a C++11 extension
Parser/cxx-decl.cpp
Restrict 1 instance of the following to C++98
C++98: error: commas at the end of enumerator lists are a C++11 extension
Restrict 2 instances of the following to C++98
C++98: error: rvalue references are a C++11 extension
Change in diagnostics as a result of attribute list in C++11
C++98: error: expected expression
error: expected unqualified-id
C++11: error: an attribute list cannot appear here
Restrict 1 instance of the following to C++98
C++98: error: alias declarations are a C++11 extension
Restrict 1 instance of the following to C++98
C++98: error: 'template' keyword outside of a template
Add 1 instance of the following to C++11
C++11: error: 'friend' must appear first in a non-function declaration
Change in diagnostics for unmatched braces at end of file.
C++98: error: expected ';' after top level declarator
C++11: error: expected expression
error: expected '}'
note: to match this '{'
error: expected ';' after top level declarator
Parser/cxx-friend.cpp
C++11 allows unelaborated friend declarations and non-class friend types.
Restrict the following diagnostics to C++98.
C++98: warning: unelaborated friend declaration is a C++11 extension; specify 'class' to befriend 'C'
C++98: warning: unelaborated friend declaration is a C++11 extension; specify 'union' to befriend 'U'
C++98: warning: non-class friend type 'int' is a C++11 extension
SemaCXX/anonymous-struct.cpp
In C++11, struct member ‘x’ of type S is still POD since there is nothing in the constructor.
http://www.stroustrup.com/C++11FAQ.html#PODs
Restrict the following diagnostics to C++98.
C++98: error: anonymous struct member 'x' has a non-trivial constructor
note: because type 'S' has a user-provided default constructor
C++11 allows unnamed types for template arguments
Restrict the following diagnostics to C++98.
C++98: warning: template argument uses unnamed type
note: unnamed type used in template argument was declared here
SemaCXX/class.cpp
Change in diagnostics regarding ‘auto’
C++98: warning: 'auto' storage class specifier is redundant
C++11: warning: 'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases
Restrict the following diagnostics to C++98.
C++98: warning: in-class initialization of non-static data member is a C++11 extension
Add the following diagnostics to C++11.
C++11: error: static const volatile data member must be initialized out of line
For the last part, slightly modify the test by changing const to constexpr for C++11
in C++98 we still test for
static const float x = 5.0f;
static const float y = foo();
in C++11 we test for
static constexpr float x = 5.0f;
static constexpr float y = foo();
for the above C++11 case
Assigning 5.0f to x no longer issues any diagnostics.
Assigning foo’s return to y generates the following diagnostics.
C++11: error: constexpr variable 'y' must be initialized by a constant expression
error: constexpr variable 'y' must be initialized by a constant expression
note: declared here
SemaCXX/conversion-function.cpp
Diagnostic wordings changed from C++98 to C++11
2 Changes in diagnostics between C++98 and C++11
C++98: warning: C++98 requires an accessible copy constructor for class 'A1'
when binding a reference to a temporary; was private [-Wbind-to-temporary-copy]
C++11: warning: copying parameter of type 'A1' when binding a reference to a
temporary would invoke an inaccessible constructor in C++98 [-Wc++98-compat-bind-to-temporary-copy]
C++98: error: cannot specify any part of a return type in the declaration of a conversion function
C++11: error: cannot specify any part of a return type in the declaration of a conversion function;
use an alias template to declare a conversion to 'T (&)()'
1 extra note diagnostics for move candidate constructor.
C++11: note: candidate constructor (the implicit move constructor) not viable:
no known conversion from 'smart_ptr::Y' to 'smart_ptr::X &&' for 1st argument
1 Change in diagnostics wording non-POD became non-trivial
C++98: error: cannot pass object of non-POD type 'Other' through variadic constructor; call will abort at runtim
C++11: error: cannot pass object of non-trivial type 'Other' through variadic constructor; call will abort at runtim
SemaCXX/cxx1y-variable-templates_in_class.cpp
SemaCXX/cxx1y-variable-templates_top_level.cpp
These 2 tests check for variable template support in 3 dialects:
C++98, C++11 and C++14
Since the first run line of each test specifically test for pre C++11 behavior,
simply add –std=c++98 to the first RUN line.
SemaCXX/exceptions.cpp
C++11 no longer issues an error regarding pointer to incomplete type inside throw().
This appears valid since dynamic exception specifications aka throw() has been deprecated.
And that “parameter packs are allowed in C++11.”
http://en.cppreference.com/w/cpp/language/except_spec
Restrict the following group of 3 diagnostics to C++98
C++98: error: pointer to incomplete type 'Decay::E' is not allowed in exception specification
note: in instantiation of template class 'Decay::C<Decay::E [10]>' requested here
note: forward declaration of 'Decay::E'
Also, restrict the rvalue reference diagnostics to C++98.
C++98: warning: rvalue references are a C++11 extension
SemaCXX/qual-id-test.cpp
Ambiguous class member lookup has been fixed in C++11
Restrict the following diagnostics to C++98.
C++98: error: lookup of 'base' in member access expression is ambiguous
note: lookup in the object type 'A::sub' refers here
note: lookup from the current scope refers here
SemaCXX/unused.cpp
In C++11, volatile-qualified lvalue undergoes lvalue-to-rvalue conversion inside discared-value expressions.
The statement *x; is a discared-value expression of a lvalue of an indirection.
Therefore *x; considered a use of x in C++11.
http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1054
http://stackoverflow.com/questions/20242868/correct-behaviour-of-trivial-statements-involving-expressions-with-volatile-vari
Restrict the following diagnostics to C++98.
C++98: warning: expression result unused; assign into a variable to force a volatile load
SemaCXX/warn-unused-value.cpp
Simular to previous test case, volatile in a discared-value expression is now a use in C++11
Restrict the following diagnostics to C++98.
C++98: warning: expression result unused; assign into a variable to force a volatile load
SemaTemplate/member-access-expr.cpp
Ambiguous class member lookup has been fixed in C++11
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1111
Restrict the following diagnostics to C++98.
C++98: error: lookup of 'CrazyBase' in member access expression is ambiguous
note: lookup in the object type 'X1' refers here
note: lookup from the current scope refers here
SemaTemplate/recovery-crash.cpp
C++11 allows the use of local types as template arguments.
Restrict the following diagnostics to C++98.
C++98: warning: template argument uses local type 'LocalStruct'
note: in instantiation of function template specialization
SemaTemplate/temp_arg_type.cpp
C++11 allows both local type and unnamed type to be used in template arguments.
Restrict the following diagnostics to C++98.
C++98: warning: template argument uses local type 'X'
C++98: warning: template argument uses unnamed type
note: unnamed type used in template argument was declared here
http://reviews.llvm.org/D19131
Files:
CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp
CXX/class/class.friend/p1.cpp
CXX/class/class.friend/p2.cpp
CXX/stmt.stmt/stmt.dcl/p3.cpp
CXX/temp/temp.arg/temp.arg.nontype/p1.cpp
CXX/temp/temp.arg/temp.arg.type/p2.cpp
CXX/temp/temp.fct.spec/temp.deduct/p9.cpp
CXX/temp/temp.spec/no-body.cpp
CodeGenCXX/const-init.cpp
Parser/cxx-class.cpp
Parser/cxx-decl.cpp
Parser/cxx-friend.cpp
SemaCXX/anonymous-struct.cpp
SemaCXX/class.cpp
SemaCXX/conversion-function.cpp
SemaCXX/cxx1y-variable-templates_in_class.cpp
SemaCXX/cxx1y-variable-templates_top_level.cpp
SemaCXX/exceptions.cpp
SemaCXX/qual-id-test.cpp
SemaCXX/unused.cpp
SemaCXX/warn-unused-value.cpp
SemaTemplate/member-access-expr.cpp
SemaTemplate/recovery-crash.cpp
SemaTemplate/temp_arg_type.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19131.53783.patch
Type: text/x-patch
Size: 44026 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160414/1124ab79/attachment-0001.bin>
More information about the cfe-commits
mailing list