[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)
commit5030928d60a1d9ec71aed42038d5c74bce73845b
tree1ae8ebaff95feccee1e426f51944bf4c789166ba
parent185ddc08eed6542781040b8499ef7ad15c8ae9f4
[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

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