Fix interaction between serialization and c++1z feature.
authorRichard Trieu <rtrieu@google.com>
Tue, 13 Sep 2016 01:20:40 +0000 (01:20 +0000)
committerRichard Trieu <rtrieu@google.com>
Tue, 13 Sep 2016 01:20:40 +0000 (01:20 +0000)
In c++1z, static_assert is not required to have a StringLiteral message, where
previously it was required.  Update the AST Reader to be able to handle a
null StringLiteral.

llvm-svn: 281286

clang/lib/Serialization/ASTReaderDecl.cpp
clang/test/Modules/Inputs/static_assert/a.h [new file with mode: 0644]
clang/test/Modules/Inputs/static_assert/module.modulemap [new file with mode: 0644]
clang/test/Modules/static_assert.cpp [new file with mode: 0644]

index d68d6d3..686c7f2 100644 (file)
@@ -2239,7 +2239,7 @@ void ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {
   VisitDecl(D);
   D->AssertExprAndFailed.setPointer(Reader.ReadExpr(F));
   D->AssertExprAndFailed.setInt(Record[Idx++]);
-  D->Message = cast<StringLiteral>(Reader.ReadExpr(F));
+  D->Message = cast_or_null<StringLiteral>(Reader.ReadExpr(F));
   D->RParenLoc = ReadSourceLocation(Record, Idx);
 }
 
diff --git a/clang/test/Modules/Inputs/static_assert/a.h b/clang/test/Modules/Inputs/static_assert/a.h
new file mode 100644 (file)
index 0000000..e876df0
--- /dev/null
@@ -0,0 +1,3 @@
+class S {
+  static_assert(4 == 4);
+};
diff --git a/clang/test/Modules/Inputs/static_assert/module.modulemap b/clang/test/Modules/Inputs/static_assert/module.modulemap
new file mode 100644 (file)
index 0000000..bb00c84
--- /dev/null
@@ -0,0 +1 @@
+module a { header "a.h" }
diff --git a/clang/test/Modules/static_assert.cpp b/clang/test/Modules/static_assert.cpp
new file mode 100644 (file)
index 0000000..d1b7590
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fimplicit-module-maps \
+// RUN:            -I%S/Inputs/static_assert -std=c++1z -verify %s
+// expected-no-diagnostics
+
+#include "a.h"
+
+S s;