Fix the propagation added in commit 0d490ae55f to include all redecls, not only previous ones. This fixes another instance of the assertion "Cannot get layout of forward declarations" in getASTRecordLayout(). Kudos to Alexander Kornienko for providing an initial version of the reproducer that I further simplified. Fixes #170084
76 lines
1.5 KiB
C++
76 lines
1.5 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
// RUN: cd %t
|
|
|
|
// RUN: %clang_cc1 -fmodule-name=stl -fno-cxx-modules -emit-module -fmodules -xc++ stl.cppmap -o stl.pcm
|
|
// RUN: %clang_cc1 -fmodule-name=d -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -xc++ d.cppmap -o d.pcm
|
|
// RUN: %clang_cc1 -fmodule-name=b -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -xc++ b.cppmap -o b.pcm
|
|
// RUN: %clang_cc1 -fmodule-name=a -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -fmodule-file=d.pcm -fmodule-file=b.pcm -xc++ a.cppmap -o a.pcm
|
|
// RUN: %clang_cc1 -fno-cxx-modules -fmodules -fmodule-file=a.pcm -emit-llvm -o /dev/null main.cpp
|
|
|
|
//--- a.cppmap
|
|
module "a" {
|
|
header "a.h"
|
|
}
|
|
|
|
//--- a.h
|
|
#include "b.h"
|
|
namespace {
|
|
void a(absl::set<char> c) {
|
|
absl::set<int> b;
|
|
c.end();
|
|
c.contains();
|
|
}
|
|
} // namespace
|
|
|
|
//--- b.cppmap
|
|
module "b" {
|
|
header "b.h"
|
|
}
|
|
|
|
//--- b.h
|
|
#include "c.h"
|
|
void b() { absl::set<char> x; }
|
|
|
|
//--- c.h
|
|
#include "stl.h"
|
|
namespace absl {
|
|
template <typename>
|
|
class set {
|
|
public:
|
|
struct iterator {
|
|
void u() const;
|
|
};
|
|
iterator end() const { return {}; }
|
|
void contains() const { end().u(); }
|
|
pair<iterator> e();
|
|
};
|
|
} // namespace absl
|
|
|
|
//--- d.cppmap
|
|
module "d" {
|
|
header "d.h"
|
|
}
|
|
|
|
//--- d.h
|
|
#include "c.h"
|
|
void d() { absl::set<char> x; }
|
|
|
|
//--- stl.cppmap
|
|
module "stl" {
|
|
header "stl.h"
|
|
}
|
|
|
|
//--- stl.h
|
|
#ifndef _STL_H_
|
|
#define _STL_H_
|
|
template <class>
|
|
struct pair;
|
|
#endif
|
|
|
|
//--- main.cpp
|
|
// expected-no-diagnostics
|
|
#include "c.h"
|
|
void f(absl::set<char> o) { o.contains(); }
|