r212238 - Enable clang to continue to parse libstdc++4.6 and stlport after r210091.
Richard Smith
richard at metafoo.co.uk
Wed Jul 2 17:09:28 PDT 2014
On Wed, Jul 2, 2014 at 4:51 PM, Nico Weber <nicolasweber at gmx.de> wrote:
> Author: nico
> Date: Wed Jul 2 18:51:09 2014
> New Revision: 212238
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212238&view=rev
> Log:
> Enable clang to continue to parse libstdc++4.6 and stlport after r210091.
>
> r210091 made initialization checking more strict in c++11 mode. LWG2193 is
> about changing standard libraries to still be valid under these new rules,
> but older libstdc++ (e.g. libstdc++4.6 in -D_GLIBCXX_DEBUG=1 mode, or
> stlport)
> do not implement that yet. So fall back to the C++03 semantics for
> container
> classes in system headers below the std namespace.
>
> Added:
>
> cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist-system-header.cpp
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/lib/Sema/SemaInit.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=212238&r1=212237&r2=212238&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jul 2
> 18:51:09 2014
> @@ -2128,6 +2128,10 @@ def err_attribute_dllimport_static_field
> def warn_attribute_dllimport_static_field_definition : Warning<
> "definition of dllimport static field">,
> InGroup<DiagGroup<"dllimport-static-field-def">>;
> +def warn_invalid_initializer_from_system_header : Warning<
> + "invalid constructor form class in system header, should not be
> explicit">,
> + InGroup<DiagGroup<"invalid-initializer-from-system-header">>;
> +def note_used_in_initialization_here : Note<"used in initialization
> here">;
> def err_attribute_dll_member_of_dll_class : Error<
> "attribute %q0 cannot be applied to member of %q1 class">;
> def warn_attribute_dll_instantiated_base_class : Warning<
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=212238&r1=212237&r2=212238&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Wed Jul 2 18:51:09 2014
> @@ -353,8 +353,9 @@ ExprResult InitListChecker::PerformEmpty
> // If there are fewer initializer-clauses in the list than there are
> // members in the aggregate, then each member not explicitly
> initialized
> // ...
> - if (SemaRef.getLangOpts().CPlusPlus11 &&
> - Entity.getType()->getBaseElementTypeUnsafe()->isRecordType()) {
> + bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
> + Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
> + if (EmptyInitList) {
> // C++1y / DR1070:
> // shall be initialized [...] from an empty initializer list.
> //
> @@ -376,6 +377,56 @@ ExprResult InitListChecker::PerformEmpty
> }
>
> InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
> + // libstdc++4.6 marks the vector default constructor as explicit in
> + // _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case.
> + // stlport does so too. Look for std::__debug for libstdc++, and for
> + // std:: for stlport. This is effectively a compiler-side
> implementation of
> + // LWG2193.
> + if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
> + InitializationSequence::FK_ExplicitConstructor) {
> + OverloadCandidateSet::iterator Best;
> + OverloadingResult O =
> + InitSeq.getFailedCandidateSet()
> + .BestViableFunction(SemaRef, Kind.getLocation(), Best);
> + (void)O;
> + assert(O == OR_Success && "Inconsistent overload resolution");
> + CXXConstructorDecl *CtorDecl =
> cast<CXXConstructorDecl>(Best->Function);
> + CXXRecordDecl *R = CtorDecl->getParent();
> +
> + if (CtorDecl->getMinRequiredArguments() == 0 &&
> + CtorDecl->isExplicit() && R->getDeclName() &&
> + SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
> +
> +
> + bool IsInStd = false;
> + for (NamespaceDecl *ND =
> dyn_cast<NamespaceDecl>(R->getDeclContext());
> + ND && !IsInStd;
> + ND = dyn_cast<NamespaceDecl>(ND->getLexicalParent())) {
>
Minor nit: use getParent() not getLexicalParent() here. (This doesn't
matter today, but EWG are considering allowing 'namespace A::B', and that
would make this matter.)
> + if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND))
> + IsInStd = true;
> + }
> +
> + if (IsInStd && llvm::StringSwitch<bool>(R->getName())
> + .Cases("basic_string", "deque", "forward_list", true)
> + .Cases("list", "map", "multimap", "multiset", true)
> + .Cases("priority_queue", "queue", "set", "stack", true)
> + .Cases("unordered_map", "unordered_set", "vector", true)
> + .Default(false)) {
> + InitSeq.InitializeFrom(
> + SemaRef, Entity,
> + InitializationKind::CreateValue(Loc, Loc, Loc, true),
> + MultiExprArg(), /*TopLevelOfInitList=*/false);
> + // Emit a warning for this. System header warnings aren't shown
> + // by default, but people working on system headers should see it.
> + if (!VerifyOnly) {
> + SemaRef.Diag(CtorDecl->getLocation(),
> + diag::warn_invalid_initializer_from_system_header);
> + SemaRef.Diag(Entity.getDecl()->getLocation(),
> + diag::note_used_in_initialization_here);
> + }
> + }
> + }
> + }
> if (!InitSeq) {
> if (!VerifyOnly) {
> InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
>
> Added:
> cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist-system-header.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist-system-header.cpp?rev=212238&view=auto
>
> ==============================================================================
> ---
> cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist-system-header.cpp
> (added)
> +++
> cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist-system-header.cpp
> Wed Jul 2 18:51:09 2014
> @@ -0,0 +1,23 @@
> +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wsystem-headers %s
> +
> +// libstdc++4.6 in debug mode has explicit default constructors.
> +// stlport has this for all containers.
> +#ifdef BE_THE_HEADER
> +#pragma clang system_header
> +namespace std {
> +namespace __debug {
> +template <class T>
> +class vector {
> +public:
> + explicit vector() {} // expected-warning{{should not be explicit}}
> +};
> +}
> +}
> +#else
> +
> +#define BE_THE_HEADER
> +#include __FILE__
> +
> +struct { int a, b; std::__debug::vector<int> c; } e[] = { {1, 1} }; //
> expected-note{{used in initialization here}}
> +
> +#endif
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140702/21814443/attachment.html>
More information about the cfe-commits
mailing list