mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 15:36:05 +00:00

Diagnostic pragmas are broken because we don't keep track of the diagnostic state changes and we only check the current/latest state. Problems manifest if a diagnostic is emitted for a source line that has different diagnostic state than the current state; this can affect a lot of places, like C++ inline methods, template instantiations, the lexer, etc. Fix the issue by having the Diagnostic object keep track of the source location of the pragmas so that it is able to know what is the diagnostic state at any given source location. Fixes rdar://8365684. llvm-svn: 121873
71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -Wall -Wunused-macros -Wunused-parameter -verify %s
|
|
|
|
// rdar://8365684
|
|
struct S {
|
|
void m1() { int b = b==b; } // expected-warning {{always evaluates to true}}
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wtautological-compare"
|
|
void m2() { int b = b==b; }
|
|
#pragma clang diagnostic pop
|
|
|
|
void m3() { int b = b==b; } // expected-warning {{always evaluates to true}}
|
|
};
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wtautological-compare"
|
|
template <typename T>
|
|
struct TS {
|
|
void m() { T b = b==b; }
|
|
};
|
|
#pragma clang diagnostic pop
|
|
|
|
void f() {
|
|
TS<int> ts;
|
|
ts.m();
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#define UNUSED_MACRO1 // expected-warning {{macro is not used}}
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wunused-macros"
|
|
#define UNUSED_MACRO2
|
|
#pragma clang diagnostic pop
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wreturn-type"
|
|
int g() { }
|
|
#pragma clang diagnostic pop
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void ww(
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wunused-parameter"
|
|
int x,
|
|
#pragma clang diagnostic pop
|
|
int y) // expected-warning {{unused}}
|
|
{
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
struct S2 {
|
|
int x, y;
|
|
S2() :
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wreorder"
|
|
y(),
|
|
x()
|
|
#pragma clang diagnostic pop
|
|
{}
|
|
};
|
|
|
|
//------------------------------------------------------------------------------
|