[cfe-commits] r151586 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp
Sebastian Redl
sebastian.redl at getdesigned.at
Mon Feb 27 15:20:01 PST 2012
Author: cornedbee
Date: Mon Feb 27 17:20:01 2012
New Revision: 151586
URL: http://llvm.org/viewvc/llvm-project?rev=151586&view=rev
Log:
Hack in a loud error for PR12086. Better than a silent miscompile.
Added:
cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp
Modified:
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=151586&r1=151585&r2=151586&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Feb 27 17:20:01 2012
@@ -1376,8 +1376,19 @@
return 0;
ASTContext &ctx = getContext();
- // Synthesize a fake VarDecl for the array and initialize that.
unsigned numInits = init->getNumInits();
+ // FIXME: This check is here because we would otherwise silently miscompile
+ // nested global std::initializer_lists. Better would be to have a real
+ // implementation.
+ for (unsigned i = 0; i < numInits; ++i) {
+ const InitListExpr *inner = dyn_cast<InitListExpr>(init->getInit(i));
+ if (inner && inner->initializesStdInitializerList()) {
+ ErrorUnsupported(inner, "nested global std::initializer_list");
+ return 0;
+ }
+ }
+
+ // Synthesize a fake VarDecl for the array and initialize that.
QualType elementType = init->getInit(0)->getType();
llvm::APInt numElements(ctx.getTypeSize(ctx.getSizeType()), numInits);
QualType arrayType = ctx.getConstantArrayType(elementType, numElements,
Added: cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp?rev=151586&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp Mon Feb 27 17:20:01 2012
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -std=c++11 -emit-llvm -o - -verify %s
+
+namespace std {
+ typedef decltype(sizeof(int)) size_t;
+
+ // libc++'s implementation
+ template <class _E>
+ class initializer_list
+ {
+ const _E* __begin_;
+ size_t __size_;
+
+ initializer_list(const _E* __b, size_t __s)
+ : __begin_(__b),
+ __size_(__s)
+ {}
+
+ public:
+ typedef _E value_type;
+ typedef const _E& reference;
+ typedef const _E& const_reference;
+ typedef size_t size_type;
+
+ typedef const _E* iterator;
+ typedef const _E* const_iterator;
+
+ initializer_list() : __begin_(nullptr), __size_(0) {}
+
+ size_t size() const {return __size_;}
+ const _E* begin() const {return __begin_;}
+ const _E* end() const {return __begin_ + __size_;}
+ };
+}
+
+std::initializer_list<std::initializer_list<int>> pleasefail = {
+ {1, 2}, {3, 4}, {5, 6} // expected-error {{cannot compile}}
+};
More information about the cfe-commits
mailing list