From 4a529d26d6ccfc9b3d11031f1256f4f87055c562 Mon Sep 17 00:00:00 2001 From: Andy Gibbs Date: Fri, 19 Oct 2012 12:36:49 +0000 Subject: [PATCH] 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 --- lib/Frontend/VerifyDiagnosticConsumer.cpp | 22 ++++++++++++++----- .../dcl.meaning/dcl.fct.default/p3.cpp | 6 ++--- .../expr.prim/expr.prim.general/p3-0x.cpp | 4 ++-- test/Frontend/verify.c | 2 +- test/Sema/compound-literal.c | 18 +++++++-------- test/Sema/vector-cast.c | 12 +++++----- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/lib/Frontend/VerifyDiagnosticConsumer.cpp b/lib/Frontend/VerifyDiagnosticConsumer.cpp index e0acd42ab2..4f30d4213a 100644 --- a/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -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(); diff --git a/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p3.cpp b/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p3.cpp index e9c5e0ca7b..5467a9222c 100644 --- a/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p3.cpp +++ b/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p3.cpp @@ -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 { diff --git a/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp b/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp index 030c90c525..b84cec61c3 100644 --- a/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp +++ b/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp @@ -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}} }; } diff --git a/test/Frontend/verify.c b/test/Frontend/verify.c index f8d0f4282b..8b4edc5a76 100644 --- a/test/Frontend/verify.c +++ b/test/Frontend/verify.c @@ -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}} diff --git a/test/Sema/compound-literal.c b/test/Sema/compound-literal.c index bac7b0e602..c5c0c17143 100644 --- a/test/Sema/compound-literal.c +++ b/test/Sema/compound-literal.c @@ -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 diff --git a/test/Sema/vector-cast.c b/test/Sema/vector-cast.c index f1cf0134dc..7fa6e86aa1 100644 --- a/test/Sema/vector-cast.c +++ b/test/Sema/vector-cast.c @@ -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 *'}} }