[AST] There is no message for C++1z-style static_assert

We would crash in the DeclPrinter trying to pretty-print the
static_assert message.  C++1z-style assertions don't have a message so
we would crash.

This fixes PR23756.

llvm-svn: 239170
This commit is contained in:
David Majnemer 2015-06-05 18:03:58 +00:00
parent 6679fc1a79
commit cdffc36c11
3 changed files with 15 additions and 9 deletions

View File

@ -733,8 +733,10 @@ void DeclPrinter::VisitImportDecl(ImportDecl *D) {
void DeclPrinter::VisitStaticAssertDecl(StaticAssertDecl *D) {
Out << "static_assert(";
D->getAssertExpr()->printPretty(Out, nullptr, Policy, Indentation);
Out << ", ";
D->getMessage()->printPretty(Out, nullptr, Policy, Indentation);
if (StringLiteral *SL = D->getMessage()) {
Out << ", ";
SL->printPretty(Out, nullptr, Policy, Indentation);
}
Out << ")";
}

View File

@ -546,13 +546,8 @@ _bittestandset(long *a, long b) {
#if defined(__i386__) || defined(__x86_64__)
static __inline__ unsigned char __attribute__((__always_inline__, __nodebug__))
_interlockedbittestandset(long volatile *__BitBase, long __BitPos) {
unsigned char __Res;
__asm__ ("xor %0, %0\n"
"lock bts %2, %1\n"
"setc %0\n"
: "=r" (__Res), "+m"(*__BitBase)
: "Ir"(__BitPos));
return __Res;
long __OldVal = __atomic_fetch_or(__BitBase, 1 << __BitPos, 5);
return (__OldVal >> __BitPos) & 1;
}
#endif
#ifdef __x86_64__

View File

@ -51,3 +51,12 @@ StaticAssertProtected<X> sap2; // expected-note {{instantiation}}
static_assert(true); // expected-warning {{C++1z extension}}
static_assert(false); // expected-error-re {{failed{{$}}}} expected-warning {{extension}}
void PR23756() {
struct { // expected-note 2 {{no known conversion from}}
} _ = decltype( // expected-error {{no viable conversion}}
({ // expected-warning {{no effect in an unevaluated context}}
static_assert(true); // expected-warning {{C++1z extension}}
1;
})){};
}