AST: Limit zero-sized constexpr behavior to array types
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 14 Dec 2014 08:40:47 +0000 (08:40 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 14 Dec 2014 08:40:47 +0000 (08:40 +0000)
Restricting this "extension" to array types maximizes our standards
conformance while not miscompiling real-world programs.

llvm-svn: 224215

clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx11.cpp

index 417f793..ad36e76 100644 (file)
@@ -1426,7 +1426,9 @@ static bool isZeroSized(const LValue &Value) {
   const ValueDecl *Decl = GetLValueBaseDecl(Value);
   if (Decl && isa<VarDecl>(Decl)) {
     QualType Ty = Decl->getType();
-    return Ty->isIncompleteType() || Decl->getASTContext().getTypeSize(Ty) == 0;
+    if (Ty->isArrayType())
+      return Ty->isIncompleteType() ||
+             Decl->getASTContext().getTypeSize(Ty) == 0;
   }
   return false;
 }
index cf31795..dbb1255 100644 (file)
@@ -1960,6 +1960,7 @@ namespace PR21786 {
   extern void (*start[])();
   extern void (*end[])();
   static_assert(&start != &end, ""); // expected-error {{constant expression}}
+  static_assert(&start != nullptr, "");
 
   struct Foo;
   struct Bar {
@@ -1967,7 +1968,7 @@ namespace PR21786 {
     static const Foo y;
   };
   static_assert(&Bar::x != nullptr, "");
-  static_assert(&Bar::x != &Bar::y, ""); // expected-error {{constant expression}}
+  static_assert(&Bar::x != &Bar::y, "");
 }
 
 namespace PR21859 {