зеркало из https://github.com/microsoft/clang-1.git
Fix directive parsing in VerifyDiagnosticConsumer so that it ensures that "expected" is at the start of the word and will no longer accept typos such as "junkexpected-*" as a valid "expected-*" directive. A very few test-cases had to be amended to adhere to the new rule.
Patch reviewed by David Blaikie. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166279 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
79cf161f17
Коммит
4a529d26d6
|
@ -226,10 +226,22 @@ public:
|
|||
|
||||
// Return true if string literal is found.
|
||||
// When true, P marks begin-position of S in content.
|
||||
bool Search(StringRef S) {
|
||||
P = std::search(C, End, S.begin(), S.end());
|
||||
PEnd = P + S.size();
|
||||
return P != End;
|
||||
bool Search(StringRef S, bool EnsureStartOfWord = false) {
|
||||
do {
|
||||
P = std::search(C, End, S.begin(), S.end());
|
||||
PEnd = P + S.size();
|
||||
if (P == End)
|
||||
break;
|
||||
if (!EnsureStartOfWord
|
||||
// Check if string literal starts a new word.
|
||||
|| P == Begin || isspace(P[-1])
|
||||
// Or it could be preceeded by the start of a comment.
|
||||
|| (P > (Begin + 1) && (P[-1] == '/' || P[-1] == '*')
|
||||
&& P[-2] == '/'))
|
||||
return true;
|
||||
// Otherwise, skip and search again.
|
||||
} while (Advance());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Advance 1-past previous next/search.
|
||||
|
@ -271,7 +283,7 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM,
|
|||
bool FoundDirective = false;
|
||||
for (ParseHelper PH(S); !PH.Done();) {
|
||||
// Search for token: expected
|
||||
if (!PH.Search("expected"))
|
||||
if (!PH.Search("expected", true))
|
||||
break;
|
||||
PH.Advance();
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
void nondecl(int (*f)(int x = 5)) // {expected-error {{default arguments can only be specified}}}
|
||||
void nondecl(int (*f)(int x = 5)) // expected-error {{default arguments can only be specified}}
|
||||
{
|
||||
void (*f2)(int = 17) // {expected-error {{default arguments can only be specified}}}
|
||||
= (void (*)(int = 42))f; // {expected-error {{default arguments can only be specified}}}
|
||||
void (*f2)(int = 17) // expected-error {{default arguments can only be specified}}
|
||||
= (void (*)(int = 42))f; // expected-error {{default arguments can only be specified}}
|
||||
}
|
||||
|
||||
struct X0 {
|
||||
|
|
|
@ -91,11 +91,11 @@ namespace Static {
|
|||
|
||||
namespace PR12564 {
|
||||
struct Base {
|
||||
void bar(Base&) {} // unexpected-note {{here}}
|
||||
void bar(Base&) {} // FIXME: expected-note {{here}}
|
||||
};
|
||||
|
||||
struct Derived : Base {
|
||||
// FIXME: This should be accepted.
|
||||
void foo(Derived& d) noexcept(noexcept(d.bar(d))) {} // unexpected-error {{cannot bind to a value of unrelated type}}
|
||||
void foo(Derived& d) noexcept(noexcept(d.bar(d))) {} // expected-error {{cannot bind to a value of unrelated type}}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#if 0
|
||||
// expected-error {{should be ignored}}
|
||||
#endif
|
||||
|
||||
// eexpected-error {{should also be ignored: unrecognised directive}}
|
||||
#error should not be ignored
|
||||
// expected-error@-1 1+ {{should not be ignored}}
|
||||
|
||||
|
|
|
@ -6,15 +6,15 @@ struct foo { int a, b; };
|
|||
static struct foo t = (struct foo){0,0};
|
||||
static struct foo t1 = __builtin_choose_expr(0, (struct foo){0,0}, (struct foo){0,0});
|
||||
static struct foo t2 = {0,0};
|
||||
static struct foo t3 = t2; // -expected-error {{initializer element is not a compile-time constant}}
|
||||
static struct foo t3 = t2; // expected-error {{initializer element is not a compile-time constant}}
|
||||
static int *p = (int []){2,4};
|
||||
static int x = (int){1};
|
||||
|
||||
static int *p2 = (int []){2,x}; // -expected-error {{initializer element is not a compile-time constant}}
|
||||
static long *p3 = (long []){2,"x"}; // -expected-warning {{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char [2]'}}
|
||||
static int *p2 = (int []){2,x}; // expected-error {{initializer element is not a compile-time constant}}
|
||||
static long *p3 = (long []){2,"x"}; // expected-warning {{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char [2]'}}
|
||||
|
||||
typedef struct { } cache_t; // -expected-warning{{empty struct is a GNU extension}}
|
||||
static cache_t clo_I1_cache = ((cache_t) { } ); // -expected-warning{{use of GNU empty initializer extension}}
|
||||
typedef struct { } cache_t; // expected-warning{{empty struct is a GNU extension}}
|
||||
static cache_t clo_I1_cache = ((cache_t) { } ); // expected-warning{{use of GNU empty initializer extension}}
|
||||
|
||||
typedef struct Test {int a;int b;} Test;
|
||||
static Test* ll = &(Test) {0,0};
|
||||
|
@ -27,11 +27,11 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
|
||||
struct Incomplete; // expected-note{{forward declaration of 'struct Incomplete'}}
|
||||
struct Incomplete* I1 = &(struct Incomplete){1, 2, 3}; // -expected-error {{variable has incomplete type}}
|
||||
struct Incomplete* I1 = &(struct Incomplete){1, 2, 3}; // expected-error {{variable has incomplete type}}
|
||||
void IncompleteFunc(unsigned x) {
|
||||
struct Incomplete* I2 = (struct foo[x]){1, 2, 3}; // -expected-error {{variable-sized object may not be initialized}}
|
||||
(void){1,2,3}; // -expected-error {{variable has incomplete type}}
|
||||
(void(void)) { 0 }; // -expected-error{{illegal initializer type 'void (void)'}}
|
||||
struct Incomplete* I2 = (struct foo[x]){1, 2, 3}; // expected-error {{variable-sized object may not be initialized}}
|
||||
(void){1,2,3}; // expected-error {{variable has incomplete type}}
|
||||
(void(void)) { 0 }; // expected-error{{illegal initializer type 'void (void)'}}
|
||||
}
|
||||
|
||||
// PR6080
|
||||
|
|
|
@ -10,22 +10,22 @@ void f()
|
|||
t2 v2;
|
||||
t3 v3;
|
||||
|
||||
v2 = (t2)v1; // -expected-error {{invalid conversion between vector type \
|
||||
v2 = (t2)v1; // expected-error {{invalid conversion between vector type \
|
||||
't2' and 't1' of different size}}
|
||||
v1 = (t1)v2; // -expected-error {{invalid conversion between vector type \
|
||||
v1 = (t1)v2; // expected-error {{invalid conversion between vector type \
|
||||
't1' and 't2' of different size}}
|
||||
v3 = (t3)v2;
|
||||
|
||||
v1 = (t1)(char *)10; // -expected-error {{invalid conversion between vector \
|
||||
v1 = (t1)(char *)10; // expected-error {{invalid conversion between vector \
|
||||
type 't1' and scalar type 'char *'}}
|
||||
v1 = (t1)(long long)10;
|
||||
v1 = (t1)(short)10; // -expected-error {{invalid conversion between vector \
|
||||
v1 = (t1)(short)10; // expected-error {{invalid conversion between vector \
|
||||
type 't1' and integer type 'short' of different size}}
|
||||
|
||||
long long r1 = (long long)v1;
|
||||
short r2 = (short)v1; // -expected-error {{invalid conversion between vector \
|
||||
short r2 = (short)v1; // expected-error {{invalid conversion between vector \
|
||||
type 't1' and integer type 'short' of different size}}
|
||||
char *r3 = (char *)v1; // -expected-error {{invalid conversion between vector\
|
||||
char *r3 = (char *)v1; // expected-error {{invalid conversion between vector\
|
||||
type 't1' and scalar type 'char *'}}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче