-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Description
Summary
When using Clang modules, deprecation warnings are incorrectly suppressed when a template defined in a module marked with [system] is instantiated with a deprecated user-defined type.
Normally, Clang suppresses warnings originating from system headers, but it should still report warnings when a system header template (like std::make_unique) uses a deprecated type from user code. This works correctly without modules, but fails when the system header is part of a [system] module.
Reproduction
The following shell script demonstrates the issue. It defines a module A marked as [system] containing a template make_unique. When make_unique<C>() is called with a deprecated class C, no warning is reported if modules are enabled.
dir=$(mktemp -d)
cd $dir
echo '
// [system] suppresses deprecated warning.
module A [system] {
header "A.h"
}
' > module.modulemap
echo '
template<typename T>
void make_unique() {
T();
}
' > A.h
echo '
#include "A.h"
class C {
public:
C() __attribute__((deprecated("","")));
};
void bar() {
make_unique<C>();
}
' > use.cc
clang -cc1 -x c++ -emit-module -o A.pcm -fmodules module.modulemap -fmodule-name=A
echo "compile with module (Warning SUPPRESSED - Incorrect)"
clang -cc1 -x c++ -emit-obj -I. use.cc -fmodules -fmodule-map-file=module.modulemap -fmodule-file=A=A.pcm
echo "compile without module (Warning REPORTED - Correct)"
clang -cc1 -x c++ -emit-obj -I. use.ccExpected Behavior
The deprecation warning for C::C() should be reported in both cases, as C is not a system type.
Actual Behavior
The warning is suppressed when compiling with the [system] module.
Context
Found in Chromium where std::make_unique (from a system module) was used with a deprecated type, causing build failures when modules were disabled (due to -Werror and the warning appearing) but passing silently when modules were enabled.
(source)