]> granicus.if.org Git - clang/commit
[c++20] Implement semantic restrictions for C++20 designated
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 30 Aug 2019 22:52:55 +0000 (22:52 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 30 Aug 2019 22:52:55 +0000 (22:52 +0000)
commit0c07d3746df825eed1a45bf91ddbd085dbbafe87
tree60c33013dffd7786d67fee3a2d6621e20eb405d7
parentaf1bfac502bc3ddd1059f6072f0651f3ba926f9b
[c++20] Implement semantic restrictions for C++20 designated
initializers.

This has some interesting interactions with our existing extensions to
support C99 designated initializers as an extension in C++. Those are
resolved as follows:

 * We continue to permit the full breadth of C99 designated initializers
   in C++, with the exception that we disallow a partial overwrite of an
   initializer with a non-trivially-destructible type. (Full overwrite
   is OK, because we won't run the first initializer at all.)

 * The C99 extensions are disallowed in SFINAE contexts and during
   overload resolution, where they could change the meaning of valid
   programs.

 * C++20 disallows reordering of initializers. We only check for that for
   the simple cases that the C++20 rules permit (designators of the form
   '.field_name =' and continue to allow reordering in other cases).
   It would be nice to improve this behavior in future.

 * All C99 designated initializer extensions produce a warning by
   default in C++20 mode. People are going to learn the C++ rules based
   on what Clang diagnoses, so it's important we diagnose these properly
   by default.

 * In C++ <= 17, we apply the C++20 rules rather than the C99 rules, and
   so still diagnose C99 extensions as described above. We continue to
   accept designated C++20-compatible initializers in C++ <= 17 silently
   by default (but naturally still reject under -pedantic-errors).

This is not a complete implementation of P0329R4. In particular, that
paper introduces new non-C99-compatible syntax { .field { init } }, and
we do not support that yet.

This is based on a previous patch by Don Hinton, though I've made
substantial changes when addressing the above interactions.

Differential Revision: https://reviews.llvm.org/D59754

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@370544 91177308-0d34-0410-b5e6-96231b3b80d8
29 files changed:
include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Sema/SemaExpr.cpp
lib/Sema/SemaInit.cpp
lib/Sema/SemaOverload.cpp
lib/Sema/TreeTransform.h
test/Analysis/globals.cpp
test/CXX/expr/expr.const/p2-0x.cpp
test/CodeGenObjCXX/designated-initializers.mm
test/PCH/cxx1y-default-initializer.cpp
test/Parser/cxx0x-lambda-expressions.cpp
test/Parser/objc-init.m
test/Sema/designated-initializers.c
test/Sema/static-assert.c
test/SemaCXX/aggregate-initialization.cpp
test/SemaCXX/c99.cpp
test/SemaCXX/constant-expression-cxx11.cpp
test/SemaCXX/constexpr-printing.cpp
test/SemaCXX/cxx0x-initializer-constructor.cpp
test/SemaCXX/cxx2a-initializer-aggregates.cpp
test/SemaCXX/decltype.cpp
test/SemaCXX/designated-initializers-base-class.cpp
test/SemaCXX/designated-initializers.cpp
test/SemaCXX/eval-crashes.cpp
test/SemaCXX/member-init.cpp
test/SemaObjCXX/message.mm
test/SemaTemplate/instantiate-c99.cpp
test/SemaTemplate/instantiate-init.cpp