[ODRHash] Don't hash friend functions.
In certain combinations of templated classes and friend functions, the body of friend functions does not get propagated along with function signature. Exclude friend functions for hashing to avoid this case. llvm-svn: 322350
This commit is contained in:
parent
64a0db76f9
commit
4eefb4511d
@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function) {
|
||||
|
||||
// TODO: Fix hashing for class methods.
|
||||
if (isa<CXXMethodDecl>(Function)) return;
|
||||
// And friend functions.
|
||||
if (Function->getFriendObjectKind()) return;
|
||||
|
||||
// Skip functions that are specializations or in specialization context.
|
||||
const DeclContext *DC = Function;
|
||||
|
||||
14
clang/test/Modules/Inputs/odr_hash-Friend/Box.h
Normal file
14
clang/test/Modules/Inputs/odr_hash-Friend/Box.h
Normal file
@ -0,0 +1,14 @@
|
||||
template <class T>
|
||||
struct iterator {
|
||||
void Compare(const iterator &x) { }
|
||||
friend void Check(iterator) {}
|
||||
};
|
||||
|
||||
template <class T = int> struct Box {
|
||||
iterator<T> I;
|
||||
|
||||
void test() {
|
||||
Check(I);
|
||||
I.Compare(I);
|
||||
}
|
||||
};
|
||||
6
clang/test/Modules/Inputs/odr_hash-Friend/M1.h
Normal file
6
clang/test/Modules/Inputs/odr_hash-Friend/M1.h
Normal file
@ -0,0 +1,6 @@
|
||||
#include "Box.h"
|
||||
|
||||
void Peek() {
|
||||
Box<> Gift;
|
||||
Gift.test();
|
||||
}
|
||||
5
clang/test/Modules/Inputs/odr_hash-Friend/M2.h
Normal file
5
clang/test/Modules/Inputs/odr_hash-Friend/M2.h
Normal file
@ -0,0 +1,5 @@
|
||||
#include "Box.h"
|
||||
void x() {
|
||||
Box<> Unused;
|
||||
//Unused.test();
|
||||
}
|
||||
7
clang/test/Modules/Inputs/odr_hash-Friend/M3.h
Normal file
7
clang/test/Modules/Inputs/odr_hash-Friend/M3.h
Normal file
@ -0,0 +1,7 @@
|
||||
#include "Box.h"
|
||||
#include "M2.h"
|
||||
|
||||
void Party() {
|
||||
Box<> Present;
|
||||
Present.test();
|
||||
}
|
||||
15
clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap
Normal file
15
clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap
Normal file
@ -0,0 +1,15 @@
|
||||
module Box {
|
||||
header "Box.h"
|
||||
}
|
||||
|
||||
module Module1 {
|
||||
header "M1.h"
|
||||
}
|
||||
|
||||
module Module2 {
|
||||
header "M2.h"
|
||||
}
|
||||
|
||||
module Module3 {
|
||||
header "M3.h"
|
||||
}
|
||||
19
clang/test/Modules/odr_hash-Friend.cpp
Normal file
19
clang/test/Modules/odr_hash-Friend.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
// RUN: rm -rf %t
|
||||
|
||||
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/modules.cache \
|
||||
// RUN: -I %S/Inputs/odr_hash-Friend \
|
||||
// RUN: -emit-obj -o /dev/null \
|
||||
// RUN: -fmodules \
|
||||
// RUN: -fimplicit-module-maps \
|
||||
// RUN: -fmodules-cache-path=%t/modules.cache \
|
||||
// RUN: -std=c++11 -x c++ %s -verify
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
#include "Box.h"
|
||||
#include "M1.h"
|
||||
#include "M3.h"
|
||||
|
||||
void Run() {
|
||||
Box<> Present;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user